执行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
答案 0 :(得分:1)
这里有许多潜在的问题。
Wass
真的应该是一个包,还是sys.path
上的一个条目?如果它确实是一个包,您应该将/tmp
添加到PYTHONPATH
;如果是路径条目,则应将/tmp/Wass
添加到PYTHONPATH
,并删除/tmp/Wass/__init__.py*
。python
。它混淆了这个问题。Wass
将继续作为一个包(即包含__init__.py
),则应将导入调整为from Wass.protocols.smpp.proto import ...
。import *
。这只是令人困惑;有人在阅读你的代码时不知道应该从哪个模块中找到什么名称。最终我认为您遇到的问题是由名为protocols
的顶级模块与Twisted中的多个模块冲突,以及使用import *
组合引起的。可能会将另一个名称(例如basic
或smtp
或pop3
)添加到该命名空间并与某些内容发生冲突,然后命名空间包的魔力与所有这些相结合以创建爆炸。如果没有看到引发问题的实际代码,我就不能更具体了。)。
每当遇到这样的问题时,最好退后一步,确保工作目录,脚本目录和PYTHONPATH都已分离出来,这样您就可以准确了解代码的导入方式。具体来说,我建议做这样的事情:
$ cd /tmp
$ mkdir runstuff
$ cd runstuff
$ PYTHONPATH=/tmp/Wass trial protocols
希望这对你有好处。