2016-07-06 77 views
1

我有我試圖從一個文件夾的層級下讀取自定義模塊:Python中沒有名爲模塊

> project-source 
     /tests 
      /provider 
      my_provider.py 
     settings_mock.py 
     __init__.py 

我想打電話,從my_provider.py

import tests.settings_mock as settings 

例從命令行:

project-source> python tests/provider/my_provider.py 

錯誤:

... ImportError: No module named settings_mock 

我一直得到No module named settings_mock爲錯誤。我已經出口到PYTHONPATH的路徑project_source。我已經在其根目錄下創建了一個__init__.py文件,然後在錯誤中沒有更改,從而將測試集成到一個包中。

我可以cd'ing項目源

當打印 settings_mock.py屬性
>>> import tests.settings_mock as settings 
>>> print settings.storage_provider 
correct storage provider value 

是任何人都可以在這裏指出我的錯誤?謝謝!

+0

如果您的子文件夾是包(即它們包含'__init __。py'),則可以使用相對導入:'from .. import settings_mock' – jbndlr

+0

只需將空** ___ init ___。py **添加到您的測試目錄中 – dmitryro

+0

'__init __。py'在哪裏? –

回答

1

你只有一個小小的錯誤。要使用子文件夾,您需要__init__.py,而不是您在問題中陳述的init.py。不同之處在於__init__是python的內置函數,而init則不是。在每個子文件夾中都有這個文件告訴pyhon解釋器該文件夾是需要初始化的「包」。

更新:應該指出,python通常從腳本所在的當前目錄運行。如果您的可執行主腳本是my_provider.py,那麼它不會知道要導入什麼,因爲主腳本位於比它嘗試導入的對象更低的目錄中。把它看作是一個層次結構。腳本只能導入它們下面的東西。嘗試從該文件中的所有其他文件中分離出可執行文件,如果有需要導入的東西。

+0

對不起,SO問題的格式沒有顯示,但我寫了'__init __。py'(編輯問題顯示這),所以這不是問題。 – Jenninha

+1

感謝您的更新。我會看看我是否可以再次重現您的問題。 –

+0

我無法在您的設置中重現問題,而在導入'settings_mock.py'的'project-source'目錄中運行main.py。你在哪裏運行main.py文件? –

相關問題