2012-01-09 3 views
1

암은 아래의 오류가/SMPP/테스트/test_post_upgrade.py : 여기가의 트위스트 가져올 수 없습니다 인터넷 모듈

/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 

주요 내용이다 : 여기

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/toto이 작동, 무엇에 protocols/smpp의 이름을 변경
  • .. protocols/smpp/__init__.py 비우기, 그러나 이것은 그래서 난 그냥이 파일 빈, 내 프로젝트는 더 이상 실행할 수있는 전체 프로젝트에 유용합니다 내가 충돌을 일으킬 수 있습니다 내 시스템의 모든 smpp/proto.py을 해달라고으로 protocols/smpp/test/test_post_upgrade.pyfrom protocols.toto.proto import *

에 두 번째 해결책은 ... 너무 혼란

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

"python -c '가져 오기 출력이 왜곡되어 인쇄 왜곡 .__ file__'"입니까? –

답변

1

.

  1. Wass 정말 패키지로되어인가, 아니면 sys.path의 항목입니까? 실제로 패키지 인 경우 PYTHONPATH/tmp을 추가해야합니다. 경로 항목 인 경우 /tmp/WassPYTHONPATH에 추가하고 /tmp/Wass/__init__.py*을 삭제해야합니다.
  2. 계층 구조 내의 모듈에서 python을 직접 실행하지 마십시오. 그것은 그 문제를 혼란스럽게합니다.
  3. Wass이 계속 패키지 (예 : __init__.py 포함) 인 경우 from Wass.protocols.smpp.proto import ...으로 가져 오기를 조정해야합니다.
  4. import *을 사용하지 마십시오. 혼란 스러울뿐입니다. 누군가 당신의 코드를 읽고 어떤 모듈에서 온 이름이 무엇인지 알지 못합니다.
  5. 최대한 단순화하고 문제의 원인이되는 파일 집합을 complete, runnable example 개 업로드하십시오. 나는 그 .py 파일 안에 무엇이 있는지 모르기 때문에 그 원인을 추측해야합니다.

은 궁극적으로 당신이보고있는 문제가 꼬인 내에서 여러 모듈과 충돌 protocols라는 최상위 모듈의 조합, 그리고 아마도 다른 이름으로 당겨 import *의 사용에 의해 발생하고 있다고 생각 basic 또는 smtp 또는 pop3을 해당 네임 스페이스에 삽입하고 무언가와 충돌하면 네임 스페이스 패키지의 마법이 결합되어 폭발을 만듭니다. 문제를 일으키는 실제 코드를 보지 않고서는 그보다 더 구체적 일 수는 없습니다. :).

이와 같은 문제가 발생할 때마다 작업 디렉토리, 스크립트 디렉토리 및 PYTHONPATH가 모두 분리되어 있는지 확인하면 코드를 가져 오는 방법을 정확하게 알 수 있습니다. 특히,이 같은 일을 권하고 싶습니다 :

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

희망을 당신을 위해 더 나은 운동 것이다.

+0

나는 (나처럼 보이는) 나던 지원을 논평 한 이후로 질문을 업데이트했다. –

+0

당신의 안내에 감사드립니다! 실제로 인쇄 된 뒤틀림 .__ file__은 충돌하는 가져 오기라고 지적했습니다. absolute_import에 의해 해결되었습니다. –

관련 문제