我正在尝试使用最后显示的“结构”构建一个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.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
答案 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"