[英]Importing Python modules from different working directory
我有一個使用內置模塊的Python腳本,但也導入了與主腳本本身位於同一目錄中的許多自定義模塊。
例如,我會打電話
python agent.py
and agent.py有很多導入,包括:
import checks
其中,檢查位於與agent.py相同的目錄中的文件中
agent/agent.py
agent/checks.py
當前工作目錄是代理/然后一切都很好。 但是,如果我從任何其他目錄調用agent.py,它顯然無法導入checks.py等錯誤。
我如何確保可以導入自定義模塊,無論從哪個例如調用agent.py
python /home/bob/scripts/agent/agent.py
實際上你的例子是有效的,因為checks.py與agent.py在同一個目錄中,但是說checks.py在前面的目錄中,例如;
agent/agent.py
checks.py
然后你可以做以下事情:
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if not path in sys.path:
sys.path.insert(1, path)
del path
注意__file__
的使用。
你不應該使用sys.path。 引用sys.path的Python 2.6文檔:
在程序啟動時初始化時,此列表的第一項path [0]是包含用於調用Python解釋器的腳本的目錄。 如果腳本目錄不可用(例如,如果以交互方式調用解釋器或者從標准輸入讀取腳本),則路徑[0]為空字符串,指示Python首先搜索當前目錄中的模塊。 請注意,在作為PYTHONPATH結果插入的條目之前插入了腳本目錄。
=== amod.py ===
def whoami():
return __file__
=== ascript.py ===
import sys
print "sys.argv", sys.argv
print "sys.path", sys.path
import amod
print "amod __file__", amod.whoami()
=== result of running ascript.py from afar ===
C:\somewhere_else>\python26\python \junk\timport\ascript.py
sys.argv ['\\junk\\timport\\ascript.py']
sys.path ['C:\\junk\\timport', 'C:\\WINDOWS\\system32\\python26.zip', SNIP]
amod __file__ C:\junk\timport\amod.py
如果重新運行,最后一行當然會改為... amod.pyc。 這似乎並不新穎,它適用於Python 2.1和1.5.2。
調試提示:嘗試兩個簡單的文件,就像我一樣。 嘗試使用-v和-vv運行Python。 向我們展示失敗測試的結果,包括完整的回溯和錯誤消息,以及您的兩個文件。 告訴我們你正在運行什么平台,以及什么版本的Python。 檢查checks.py文件的權限。 是否有導致干擾的checks.something_else?
您需要將當前正在執行的模塊的路徑添加到sys.path變量中。 由於您在命令行上調用它,因此腳本的路徑將始終位於sys.argv [0]中。
import sys
import os
sys.path.append(os.path.split(sys.argv[0])[0])
現在,當導入搜索模塊時,它還將查找托管agent.py文件的文件夾。
有幾種方法可以將東西添加到PYTHONPATH
。
閱讀http://docs.python.org/library/site.html
在運行腳本之前設置PYTHONPATH
環境變量。
你可以這個python -m agent
從你的PYTHONPATH
運行agent.py
.
在lib/site-packages
目錄中創建.pth
文件。
在lib/site-packages
安裝模塊。
我認為您應該考慮將代理目錄放入適當的Python包中。 然后將此包放在python路徑的任何位置,您可以將檢查導入為
from agent import checks
如果您知道check.py的完整路徑,請使用此配方( http://code.activestate.com/recipes/159571/ )
如果要將目錄添加到系統路徑 - 此配方( http://code.activestate.com/recipes/52662/ )。 在這種情況下,我必須確定應用程序目錄(sys.argv [0])將此值傳遞給AddSysPath函數。 如果您想查看生產示例,請在此主題上發表評論,以便稍后發布。
問候。
為了概括我對您的目標的理解,您希望能夠使用import custom_package_name
導入自定義包,無論您從何處調用python,無論您的python腳本位於何處。
一些答案提到了我將要描述的內容,但我覺得大多數答案都假設了很多以前的知識。 我會盡量明確表達。
為了實現允許通過import
語句導入自定義包的目標,必須通過python用於搜索包的路徑在某處發現它們。 Python實際上使用多個路徑,但我們只關注通過將sys.prefix
(在python解釋器中)的輸出與/lib/pythonX.Y/site-packages
(或lib/site-packages
/lib/pythonX.Y/site-packages
)相結合可以找到的sys.prefix
。 lib/site-packages
,如果你正在使用Windows),其中XY是你的Python版本。
具體來說,通過運行找到python使用的路徑:
import sys
your_path = sys.prefix + '/lib/pythonX.Y/site-packages'
print(your_path)
如果您使用的是python 3.5,則此路徑應類似於/usr/local/lib/python3.5/site-packages
,但根據您的設置,它可能會有很大不同。
Python使用此路徑(以及其他一些路徑)來查找要導入的包。 因此,您可以將自定義包放在/usr/local/lib/python3.5/site-packages
文件夾中。 不要忘記將init .py文件添加到該文件夾中。
再次具體,在終端類型:
cd your_path
cp path_to_custom_package/custom_package ./
現在,您應該可以導入自定義程序包的所有內容,就像程序包位於同一目錄中一樣(例如,程序import package.subpackage
中每個子程序包文件的import package.subpackage
都可以使用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.