簡體   English   中英

從不同的工作目錄導入Python模塊

[英]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

  1. 在運行腳本之前設置PYTHONPATH環境變量。

    你可以這個python -m agent從你的PYTHONPATH運行agent.py .

  2. lib/site-packages目錄中創建.pth文件。

  3. lib/site-packages安裝模塊。

我認為您應該考慮將代理目錄放入適當的Python包中。 然后將此包放在python路徑的任何位置,您可以將檢查導入為

from agent import checks

請參閱http://docs.python.org/tutorial/modules.html

如果您知道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.prefixlib/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM