Python 无法导入扭曲的';s互联网模块
我在执行python协议/smpp/test/test\u post\u upgrade.py时遇到以下错误:Python 无法导入扭曲的';s互联网模块,python,namespaces,package,twisted,Python,Namespaces,Package,Twisted,我在执行python协议/smpp/test/test\u post\u 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",
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$ 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__u;.py
- 将
重命名为任何其他名称,例如protocols/smpp
(将protocols/toto
更改为protocols/smpp/test/test\u post\u 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
这里有一些潜在的问题
was
真的应该是一个包吗,或者它是sys.path
上的一个条目吗?如果它真的是一个包,你应该将/tmp
添加到你的PYTHONPATH
;如果它是一个路径条目,你应该将/tmp/Wass
添加到PYTHONPATH
,并删除/tmp/Wass/\uu init.py*/code>
python
。这会混淆问题Wass
将继续是一个包(即包含\uuuu init\uuuu.py
),您应该将您的导入调整为从Wass.protocols.smpp.proto导入…
import*
。这会让人感到困惑;阅读您的代码的人不知道什么名称应该来自哪个模块协议
的顶级模块与Twisted中的几个模块冲突,以及使用导入*
可能会将另一个名称,如基本
或smtp
或pop3
引入到该名称中造成的然后名称空间包的魔力与它结合在一起,形成了一个爆炸性的结果
但是,每当遇到这样的问题时,最好后退一步,确保工作目录、脚本目录和PYTHONPATH都是分开的,这样您就可以确切地知道代码是如何导入的。具体地说,我建议您这样做:
$ cd /tmp
$ mkdir runstuff
$ cd runstuff
$ PYTHONPATH=/tmp/Wass trial protocols
希望这对你来说会更好。这里有一些潜在的问题
Wass
真的应该是一个包,还是它是sys.path
上的一个条目?如果它真的是一个包,那么应该将/tmp
添加到PYTHONPATH
;如果它是一个路径条目,您应该将/tmp/Wass
添加到PYTHONPATH
,并删除/tmp/Wass/\uuuu init\uuuuuuuuuuu.py*
python
。它混淆了这个问题Wass
将继续是一个包(即包含\uuuu init\uuuu.py
),您应该将您的导入调整为从Wass.protocols.smpp.proto导入…
import*
。它只是让人困惑;阅读代码的人不知道什么名字应该来自哪个模块protocols
的顶级模块组合而成的,它与Twisted中的几个模块冲突,使用import*
可能会将另一个名称,如basic
或smtp
或pop3
引入该名称空间,并与某些内容发生冲突,然后名称空间包的魔力与之结合,形成了一场爆炸。在没有看到触发问题的实际代码之前,我不能说得更具体:)
但是,每当遇到这样的问题时,最好后退一步,确保工作目录、脚本目录和PYTHONPATH都是分开的,这样您就可以确切地知道代码是如何导入的。具体地说,我建议您这样做:
$ cd /tmp
$ mkdir runstuff
$ cd runstuff
$ PYTHONPATH=/tmp/Wass trial protocols
希望这对您会有更好的效果。我已经更新了这个问题,因为评论不支持格式化(看起来…),谢谢您的指导!事实上,print twisted.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这是由绝对重要性解决的。我已经更新了这个问题,因为评论不支持格式化(看起来…)谢谢你的指导!事实上,print twisted.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它由绝对输入解析“python-c”导入扭曲;打印扭曲。“python-c”导入扭曲;打印扭曲。“python-c”导入扭曲;打印扭曲。“python-c”文件扭曲的输出是什么?