[英]PYTHONPATH vs. sys.path (RELOADED)
我想重新審視PYTHONPATH與sys.path中指定的問題。 基本上它涉及開發一個類似的包:
Project
setup.py
package
__init__.py
lib.py
script.py
假設script.py
from package.lib import foo
它在調用時可以正常工作:
python -m package.script
從setup.py
所在的目錄,但不是在調用時(在Windows上,CPython 2.7):
.\package\script.py
ImportError: No module named package
在第一種情況下,當打印sys.path
第一個條目是''
,但在第二種情況下,第一個條目是script.py
所在的絕對路徑。 當然,在這種情況下,它對package
沒有任何了解,導入失敗。 在資源管理器中雙擊時也會出現這種情況。
原始的stackoverflow問題建議通過setup.py develop
軟件包安裝。 但是,在當前的setuptools 3.5中 (我知道+ distutils / setuptools重命名的混淆)這個選項甚至沒有記錄(我有setuptools 3.4.x,但沒有嘗試)。
任何人都可以向我指出推薦的內容(“......唯一明顯的方法......”)procdere是在Windows上(對於CPython 2.7而且還考慮到Python 3)雙擊文件並讓它工作。 相對進口?
現在更好的方法是使用帶有-e選項的pip install。
pip install -e .
它使用帶有setup.py文件的目錄。 “。” 表示此目錄。 這與setuptools開發方法的工作方式相同。
我相信開發人員會在您的視覺包文件夾中創建一個雞蛋鏈接,該文件夾指向庫的文件夾。 http://pythonhosted.org/setuptools/setuptools.html#develop-deploy-the-project-source-in-development-mode
python setup.py develop
我相信這就是你獲得絕對路徑的原因。 可能與開發鏈接和安裝存在沖突。 事情也可能已經發生了變化。
對於雙擊,只需要檢查sys.argv。 如果沒有sys.argv [1]的值,則追加構建,安裝或開發。
另外,我一直聽說你要導入模塊然后從模塊中調用函數。 從包導入lib。 lib.foo()就是這樣你知道方法的來源。 我相信導入對兩種方式都做同樣的事情; 這可能會清理您的導入。 Python路徑和包裝可能會很痛苦。
from package import lib
lib.foo()
您可能需要仔細閱讀模塊搜索路徑文檔 。 請注意,搜索路徑將包含“包含輸入腳本(或當前目錄)的目錄”。 當您調用python -m package.script
,將使用當前目錄,因為沒有輸入腳本( script.py
用作模塊)。 當你運行.\\package\\script.py
,它會將.\\package
廣告到搜索路徑。
您的情況的解決方案是將所有可執行腳本放在庫層次結構的基本目錄中。 script.py
移動到一個目錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.