仅在从cmdline / console运行python时导入python包时遇到问题。但是,当使用pydev时,一切似乎都能正常工作。
我有以下文件系统......
---MarketData
---Parser
---Parser.py
---__init__.py
---IO
---__init__.py
---MarketSocket.py
目前,Parser和IO被定义为python包(它们具有 init .py文件,尽管Parser中没有代码。 init .py文件。< / p>
我正在尝试在MarketSocket.py中运行以下代码行
from Parser import Parser
哪个应该在包'Parser'中导入模块'Parser'但是,我得到以下错误。
ImportError: No Module Named Parser
任何帮助将不胜感激!这应该根据stackOverflow上的类似问题工作,但由于一些奇怪的原因,它不是。
答案 0 :(得分:2)
MarketSocket.py
位于IO
目录中。因此,无法找到包Parser
。
解决此问题的最佳方法是相对导入:from ..Parser import Parser
但如果您启动脚本,则它们可能无效:python MarketSocket.py
。要使用此功能,您还必须在__init__.py
目录中添加MarketData
。
如果不起作用,请像这样延伸sys.path
:
import sys
sys.path.append('../')
通过此添加,Python还会搜索您想要的路径。
如果我是你,我也会考虑重组你的项目。在我看来,可执行文件应该(大部分时间)位于工作树的顶部,这也像Python一样。
答案 1 :(得分:0)
MarketSocket.py比Parser低一级,因此看不到它
这样做:
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
sys.path.append(os.path.dirname(__file__))
答案 2 :(得分:0)
在MarketData目录中放置一个(空的)__init__.py
将使整个事件成为一个包(并避免丑陋的路径黑客攻击)。如果你从包的顶层调用模块,那应该就可以了。
答案 3 :(得分:0)
您遇到了相对导入问题。只有在父目录中,您才可以访问任何子包/模块。所以在MarketSocket.py中,你需要
来自..Parser导入解析器
然后当你使用-m选项运行它时,诀窍是你必须在顶级目录中运行它。所以在这种情况下 1)您将转到MarketData的父目录 2)在该父目录中,运行python -m MarketData.IO.marketSocket