无法导入Python包

时间:2012-06-22 17:51:58

标签: python import filesystems include pydev

仅在从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上的类似问题工作,但由于一些奇怪的原因,它不是。

4 个答案:

答案 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