执行模块作为脚本中断导入

时间:2012-01-27 11:21:43

标签: python

我正在尝试使用最后显示的“结构”构建一个Python程序。

问题是操作应该也可以作为脚本执行(我已经在其中包含了一个main)。当我尝试执行DummyAction.py时,请继续抱怨他们找不到misc

如何使用DummyAction.py作为脚本并仍使用utils.py中的功能?

DummyAction.py包含一个名为DummyActionClass的类,DummyTrigger.py包含相同的类。在utils.py中,有几个函数,操作和触发器都使用,MMD.py包含main。

/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

3 个答案:

答案 0 :(得分:1)

看到更新的问题,我认为问题是您应该进行导入,包括您的dependecies树的根:MMD。

所以他们应该看起来像:

from MMD.misc import utils

此外,您还需要使用python选项致电-m

python -m  MMD.actions.DummyAction

编辑:您说MMD.py包含主要内容,但它不能是您的可执行文件,那是因为它是一个模块(位于具有__init__.py的目录中文件)。 MMD就像您的库,因此您需要将可执行文件放在外面并使用此类库。

您可以找到[here]有关如何整理项目的一些指南。

如果您可以更改项目结构,我建议您这样做:

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的{​​{1}}目录中你可以执行你的代码,你也可以创建可执行文件python runner.py,这样只需runner.py即可运行你的代码。登记/> 并运行您的模块:

./runner.py

我会这样做,因为这种方式对未来的实施是开放的(并且几乎就像在行指南中一样)。

如果您不能,那么您可以尝试从python -m mmd.actions.DummyAction 目录中删除__init__.py

答案 1 :(得分:0)

我认为这是你正在讨论的目录结构,在这种情况下,python不知道在哪里查找utils.py - 它会尝试本地目录,然后路径中的一些地方放弃。修改路径很简单:

import sys
sys.path.append("/MMD/misc")
import utils

你应该离开。

答案 2 :(得分:0)

我找到了“workarround”

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 - except 块是否完全正确,但可以随意添加注释或其他解决方案。

完整解决方案将是:

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"