簡體   English   中英

腳本中斷導入時執行模塊

[英]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.pyDummyTrigger.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一個內部Mainmain.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.

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