Невозможно импортировать витой интернет-модуль - PullRequest
1 голос
/ 10 января 2012

Я получаю приведенную ниже ошибку при выполнении протоколов Python / 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 Ответ

1 голос
/ 10 января 2012

Здесь есть ряд потенциальных проблем.

  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. Постарайтесь максимально упростить это и загрузите полный, работающий пример набора файловэто вызывает проблему.Так как я не знаю, что находится внутри этих .py файлов, я должен догадаться о причине.

В конечном счете, я думаю, что проблема, которую вы видите, вызвана комбинацией верхнего уровнямодуль с именем protocols, который конфликтует с несколькими модулями в Twisted, и использование import *, которое, вероятно, вытягивает другое имя, например basic или smtp или pop3, в это пространство имен и конфликтует с чем-то, затемМагия пакетов пространства имен объединяется со всем этим, чтобы создать взрыв.Я не могу быть более конкретным, чем это, не видя фактического кода, который вызывает проблему:).

Всякий раз, когда сталкиваюсь с такой проблемой, как это, хорошо сделать шаг назад и убедиться, что рабочий каталогкаталог скриптов и PYTHONPATH разделены, поэтому вы точно знаете, как импортируется ваш код.В частности, я бы порекомендовал сделать что-то вроде этого:

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

Надеюсь, это сработает лучше для вас.

...