我在一個名爲「project」的文件夾中有我的python代碼,所以我的代碼文件在project/* .py中。我想在其中有子模塊,例如pythonic模塊組織 - 如何引用根目錄中的文件?
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
每個模塊目錄有它自己的初始化 .py文件,例如
project/mymodule1/__init__.py
假設我有mymodule1(項目/ mymodule1/test.py)內的文件「test.py」,我想指的是從「代碼」的東西,例如導入功能「MYFUNC」
== project/mymodule1/test.py ==
from code import myfunc
的問題是,「代碼」不會被發現,除非用戶已經放置了「項目/」目錄中的PYTHONPATH。有沒有辦法避免這種情況,並使用某種「相對路徑」來導入myfunc,例如
from ../code import myfunc
基本上,我不想強迫代碼的用戶修改PYTHONPATH,除非我可以從我的腳本中以編程方式爲他們做。我希望它可以開箱即用。
這怎麼辦?任何解決方案都是很好的:以編程方式更改PYTHONPATH,或者更理想的是,使用某種相對導入來引用「代碼」,因爲即使我不知道「project/code.py」在用戶計算機上的位置,我知道在哪裏它相對於「myfunc」。
編輯:有人可以顯示內部包導入適當的例子嗎?我想,從「mymodule1」做:
from .. import foo
其中「富」是code.py,但它不工作。我在mymodule1 初始化的.py,所以:
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
其中module1_code.py嘗試導入FOO,在 「code.py」 中定義的函數。
編輯:我仍然存在的主要困惑是,即使採用了響應我的消息給出的示例,顯示項目/ sub1 /測試層次結構,您仍然不能「cd」到sub1中並執行「python test.py 「並讓它工作。用戶必須在包含「project」的目錄中並執行「import project.sub1.test」。無論用戶在哪個目錄下,我都希望這樣工作。在這種情況下,用戶必須執行位於project/sub1 /中的文件「test.py」。因此,測試案例是:
$ cd project/sub1
$ python test.py
其產生錯誤:
ValueError: Attempted relative import in non-package
這可怎麼固定?
感謝。
'code.py'是否也導入'mymodule1/test.py'?如果是這樣,你會想要重新組織你的代碼。如果可能的話,應避免循環進口。 – Wilduck