无法导入twisted的互联网模块

时间:2012-01-09 23:08:44

标签: python namespaces package twisted

执行python protocols / smpp / test / test_post_upgrade.py时出现以下错误:

Traceback (most recent call last):
  File "protocols/smpp/test/test_post_upgrade.py", line 1, in <module>
    from protocols.smpp.proto import *
  File "/tmp/Wass/protocols/smpp/proto.py", line 1, in <module>
    from twisted.internet import defer, reactor
ImportError: No module named internet

这是我的树:

/tmp/Wass$ tree
.
├── __init__.py
└── protocols
    ├── __init__.py
    ├── __init__.pyc
    └── smpp
        ├── __init__.py
        ├── __init__.pyc
        ├── proto.py
        ├── proto.pyc
        └── test
            ├── __init__.py
            └── test_post_upgrade.py

3 directories, 10 files

以下是主要文件的内容:

/tmp/Wass$ cat protocols/smpp/proto.py
from twisted.internet import defer, reactor

/tmp/Wass$ cat protocols/smpp/test/test_post_upgrade.py 
from protocols.smpp.proto import *

/tmp/Wass$ cat protocols/smpp/__init__.py
__import__('pkg_resources').declare_namespace(__name__)

有关信息,我可以通过以下操作之一解决此问题:

  • 清空protocols/smpp/__init__.py,但这对整个项目很有用,所以我可以清空这个文件,我的项目将不再运行..
  • protocols/smpp重命名为其他内容,例如protocols/toto即可使用(将protocols/smpp/test/test_post_upgrade.py更改为from protocols.toto.proto import *

第二种解决方案令人困惑,因为我的系统中没有smpp/proto.py可能导致冲突...

以下是该问题的简单表示:

Wass/
Wass/__init__.py
Wass/protocols/
Wass/protocols/smpp/
Wass/protocols/smpp/__init__.py
Wass/protocols/smpp/test/
Wass/protocols/smpp/test/__init__.py
Wass/protocols/__init__.py

Wass/protocols/smpp/test/test_post_upgrade.py:
> from Wass.protocols.smpp.proto import SMPPClientProtocol

Wass/protocols/smpp/proto.py
> from twisted.internet import defer, reactor
>
> class SMPPClientProtocol:
>     pass

执行结果:

$ echo $PYTHONPATH
:/opt/smpp.twisted/:/opt/smpp.pdu/:/tmp/Wass/
python /tmp/Wass/protocols/smpp/test/test_post_upgrade.py
> Returns the same problem above

1 个答案:

答案 0 :(得分:1)

这里有许多潜在的问题。

  1. Wass真的应该是一个包,还是sys.path上的一个条目?如果它确实是一个包,您应该将/tmp添加到PYTHONPATH;如果是路径条目,则应将/tmp/Wass添加到PYTHONPATH,并删除/tmp/Wass/__init__.py*
  2. 不要直接在层次结构中的模块上运行python。它混淆了这个问题。
  3. 如果Wass将继续作为一个包(即包含__init__.py),则应将导入调整为from Wass.protocols.smpp.proto import ...
  4. 请勿使用import *。这只是令人困惑;有人在阅读你的代码时不知道应该从哪个模块中找到什么名称。
  5. 尝试尽可能简化此操作,并上传导致问题的一组complete, runnable example文件。由于我不知道那些.py文件里面有什么,我必须猜测原因。
  6. 最终我认为您遇到的问题是由名为protocols的顶级模块与Twisted中的多个模块冲突,以及使用import *组合引起的。可能会将另一个名称(例如basicsmtppop3)添加到该命名空间并与某些内容发生冲突,然后命名空间包的魔力与所有这些相结合以创建爆炸。如果没有看到引发问题的实际代码,我就不能更具体了。)。

    每当遇到这样的问题时,最好退后一步,确保工作目录,脚本目录和PYTHONPATH都已分离出来,这样您就可以准确了解代码的导入方式。具体来说,我建议做这样的事情:

    $ cd /tmp
    $ mkdir runstuff
    $ cd runstuff
    $ PYTHONPATH=/tmp/Wass trial protocols
    

    希望这对你有好处。