[英]Execute module as script breaks imports
我正在嘗試使用最后顯示的“結構”構建一個Python程序。
問題在於動作也應該能夠作為腳本執行(我已經在其中包含了主要內容)。 當我嘗試執行DummyAction.py
導入時, DummyAction.py
抱怨它們找不到misc
。
如何將DummyAction.py
用作腳本,而仍然使用utils.py
的函數?
DummyAction.py
包含一個名為DummyActionClass
的類,與DummyTrigger.py
相同。 在utils.py
,有多個功能utils.py
動作和觸發器使用,而MMD.py
包含主要功能。
/MMD
├── __init__.py
├── MMD.py
├── /actions
│ ├── __init__.py
│ ├── DummyAction.py
├── /misc
│ ├── __init__.py
│ ├── utils.py
└── /triggers
├── DummyTrigger.py
└── __init__.py
DummyAction.py
和DummyTrigger.py
的導入為:
from misc import utils
錯誤是:
File "DDM/actions/DummyAction.py", line 11, in <module>
from misc import utils
ImportError: No module named misc
看到更新后的問題,我認為問題是您應該進行導入,包括依賴關系樹的根:MMD。
因此,它們都應該看起來像:
from MMD.misc import utils
而且您還需要使用-m
選項調用python
:
python -m MMD.actions.DummyAction
編輯:您說過MMD.py
包含主文件,但不能作為您的可執行文件,這是因為它是一個模塊(位於__init__.py
文件所在的目錄中)。 MMD
就像您的庫,因此您需要將可執行文件放在外部並使用該庫。
您可以在此處找到有關如何組織項目的一些准則。
如果您可以更改項目結構,則建議這樣做:
MMD/
├── runner.py
└── mmd
├── __init__.py
├── main.py
├── /actions
│ ├── __init__.py
│ ├── DummyAction.py
├── /misc
│ ├── __init__.py
│ ├── utils.py
└── /triggers
├── DummyTrigger.py
└── __init__.py
然后,在mmd
目錄內的任何文件中 , 每個導入都應以mmd
,例如:
from mmd.misc import utils
from mmd.actions import DummyActions
你把你的主代碼,現在是里面MMD.py
一個內部Main
類main.py
,喜歡的東西:
# main.py
from mmd.misc import utils
class Main:
def start_session(self):
utils.function()
# etc ...
然后在runner.py
執行以下操作:
# runner.py
from mmd.main import Main
cli = Main()
cli.start_session()
這樣,在MMD
目錄中調用python runner.py
的代碼中,您將執行代碼,還可以使可執行文件runner.py
成為一個簡單的./runner.py
文件,即可運行您的代碼。
並使用以下命令運行模塊:
python -m mmd.actions.DummyAction
我會這樣做,因為這種方式對將來的實現是開放的(並且幾乎就像在線指南中一樣)。
如果不能,那么可以嘗試從MMD
目錄中刪除__init__.py
。
我假設這是您正在談論的目錄結構,在這種情況下python不知道在哪里尋找utils.py-它嘗試本地目錄,路徑中的一些地方然后放棄。 修改路徑非常簡單:
import sys
sys.path.append("/MMD/misc")
import utils
你應該走了
我找到了一個“工作區”
try:
#When executing from the main
from misc import utils
except:
#When executing as a standalone script
from MMD.misc import utils
允許:
python -m MMD.actions.DummyAction
python MMD/MMD.py
盡管我不確定使用try是否嚴格正確-除了帶有導入功能的塊,請隨時添加注釋或其他解決方案。
完整的解決方案是:
MMD.main
from misc import utils
from actions import DummyAction
class MMD():
def __init__(self):
a = DummyAction.DummyActionClass()
utils.foo()
if __name__ == '__main__':
d = MMD()
然后在actions/DummyAction.py
:
try:
#When executing from the main
from misc import utils
except:
#When executing as a standalone script
from MMD.misc import utils
class DummyActionClass():
def __init__(self):
utils.foo()
if __name__ == '__main__':
a = DummyActionClass()
最后在misc/utils.py
:
def foo():
print "Foo was called"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.