2012-06-22 118 views
1

我在从cmdline/console运行python时仅导入python包时遇到问题。但是,使用pydev时,一切似乎都正常。无法导入Python包

我有以下的文件系统......

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

目前,解析器和IO被定义为Python包(他们有初始化 .py文件,虽然在解析器没有任何代码。INIT .py文件。

我试图运行下面的代码行MarketSocket.py

from Parser import Parser 

但是,应该在包“Parser”中导入模块“解析器”,但出现以下错误。

ImportError: No Module Named Parser 

任何帮助,将不胜感激!这应该根据stackoverflow的类似问题,但出于一些奇怪的原因,它不是。

回答

2

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

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

如果它不工作延长sys.path这样的:

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

有了这个此外,巨蟒还搜索你想要的路径。

如果我是你,我也会考虑重组你的项目。在我看来,可执行文件应该(大部分时候)在工作树的顶部,这也像Python的作品。

+1

这是一个可怕的解决方案。当使用适当的结构时修改路径是一个不好的解决方案。 –

+0

当然,只要Python不会改变它们有关包的默认行为,我认为sys.path几乎是你的唯一选择,如果你想使用像'#!/ usr/bin/env python'这样的东西, 。个人而言,'python -m'不是我的选择。 –

+0

出于兴趣,为什么'python -m'不是一个选项?我建议创建一个顶级模块,以便在这种情况下导入更好的解决方案。 –

0

的MarketSocket.py低于分析器一个水平,因此不能看到它

做到这一点:

import os 
import sys 
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) 
sys.path.append(os.path.dirname(__file__)) 
0

将一个(空的)__init__.py放在MarketData目录中将使整个事情成为一个包(并避免丑陋的路径攻击)。如果你从包的顶层调用模块,这应该是正常的。

+0

不幸的是,这不会总是工作。如果他直接执行'MarketSocket.py',他会得到'ValueError:试图在非包中进行相对导入'。我不明白为什么Python开发者会这么做...... –

+1

在正确的命名空间中调用它:'python -m IO.MarketSocket' –

+0

@DavidHalter对不起,我误解了你的观点(尽管我的评论并不正确) 。它工作得很好,因为它只有一个级别,如果你在MarketData目录中。真正重要的一点是应该考虑你想要什么样的结构以及你如何导入代码并使用这个包结构。 –

0

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

从..Parser进口分析器

然后,当你使用-m选项可以运行它,关键是你要在顶级目录运行它。所以在这种情况下, 1)你会去到MarketData的父目录 2)在该父目录中运行python -m MarketData.IO.marketSocket