1

仅在从 cmdline/console 运行 python 时,我无法导入 python 包。但是,当使用 pydev 时,一切似乎都运行良好。

我有以下文件系统...

---MarketData
   ---Parser
      ---Parser.py
      ---__init__.py
   ---IO
      ---__init__.py
      ---MarketSocket.py

目前,Parser 和 IO 被定义为 python 包(它们有init .py 文件,虽然Parser.init .py 文件中没有代码。

我正在尝试在 MarketSocket.py 中运行以下代码行

from Parser import Parser

应该在包'Parser'中导入模块'Parser'但是,我收到以下错误。

ImportError: No Module Named Parser

任何帮助,将不胜感激!这应该根据 stackOverflow 上的类似问题起作用,但由于某些奇怪的原因,它不是。

4

4 回答 4

2

MarketSocket.py在目录中IO。因此无法找到包Parser

解决此问题的最佳方法是相对导入:from ..Parser import Parser但如果您启动以下脚本,它们可能不起作用:python MarketSocket.py. 要使用它,您还必须将一个添加__init__.py到您的MarketData目录中。

如果它不起作用,请扩展sys.path如下:

import sys
sys.path.append('../')

有了这个附加功能,Python 还会搜索您想要的路径。

如果我是你,我也会考虑重组你的项目。在我看来,可执行文件应该(大部分时间)位于工作树的顶部,这也类似于 Python 的工作方式。

于 2012-06-22T17:56:41.337 回答
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__))
于 2012-06-22T17:56:24.070 回答
0

在 MarketData 目录中放置一个(空的)__init__.py将使整个东西成为一个包(并避免丑陋的路径黑客)。如果你从包的顶层调用模块,那应该就可以了。

于 2012-06-22T18:02:25.813 回答
0

您遇到了相对导入的问题。只有在父目录中,您才能访问任何子包/模块。所以在 MarketSocket.py 中,你需要

从..解析器导入解析器

然后,当您使用 -m 选项运行它时,诀窍是您必须在顶级目录中运行它。所以在这种情况下 1) 你将转到 MarketData 的父目录 2) 在该父目录中,运行 python -m MarketData.IO.marketSocket

于 2015-01-30T20:35:42.863 回答