Python 无法导入扭曲的';s互联网模块

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",

我在执行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", 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*
    。这会让人感到困惑;阅读您的代码的人不知道什么名称应该来自哪个模块
  • 尽量简化这个过程,并上传一组导致问题的文件。由于我不知道这些.py文件中包含什么,我不得不猜测原因
  • 最后,我认为您看到的问题是由名为
    协议
    的顶级模块与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*
    。它只是让人困惑;阅读代码的人不知道什么名字应该来自哪个模块
  • 尽量简化这个过程,并上传一组导致问题的文件。因为我不知道那些.py文件里面是什么,所以我不得不猜测原因
  • 最终,我认为您看到的问题是由名为
    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”文件扭曲的输出是什么?