无法导入twisted的internet modu

2024-09-28 22:24:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在执行python protocols/smpp/test/test_post时遇到以下错误_升级.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

这是我的树:

^{pr2}$

以下是主要文件的内容:

/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

Tags: frompytestimportinittwistedsmpppost
1条回答
网友
1楼 · 发布于 2024-09-28 22:24:52

这里有许多潜在的问题。在

  1. Wass真的应该是一个包,还是它是sys.path上的一个条目?如果它真的是一个包,那么您应该将/tmp添加到PYTHONPATH;如果它是一个路径条目,则应该向PYTHONPATH添加{},并删除{}。在
  2. 不要在层次结构中的模块上直接运行python。它混淆了这个问题。在
  3. 如果Wass将继续是一个包(即包含一个__init__.py),则应将导入调整为from Wass.protocols.smpp.proto import ...。在
  4. 不要使用import *。这只是令人困惑;读代码的人根本不知道什么名字应该来自哪个模块。在
  5. 尽量简化这个过程,并上传一组导致问题的文件complete, runnable example。因为我不知道那些.py文件里面有什么,我得猜测原因。在

最终,我认为您所看到的问题是由一个名为protocols的顶层模块的组合引起的,它与Twisted中的几个模块冲突,以及使用import *这可能是将另一个名称,如basic或{}或{}拉入该名称空间并与某些东西发生冲突,然后名称空间包与它们结合在一起形成了一个爆炸。如果没有看到触发问题的实际代码,我再具体不过了。在

但是,每当遇到这样的问题时,最好后退一步,确保工作目录、脚本目录和PYTHONPATH都是分开的,这样您就可以确切地知道代码是如何导入的。具体地说,我建议您这样做:

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

希望这样对你更好。在

相关问题 更多 >