2017-04-10 2 views
2

PyDev를 사용하여 python3 패키지를 만들고 있습니다. 내 .py 파일 중 하나에는 상대적 상대 가져 오기 인 from . import filename이 있습니다. 나는 패키지 외부의 다른 파일을 사용하면 패키지에서 가져가 잘 작동 해당 파일을 테스트하지만, 직접의 PyDev에서 해당 파일을 실행하면이 오류와 함께 실패 할 수 :__name__ in Python, Pydev

ImportError: attempted relative import with no known parent package 

검색을 많이 후, 나는 발견 모든 가져 오기가 이루어지기 전에 코드를 추가 할 때 작동하는 일부 코드는 다음과 같습니다.

__path__ = [""] # indicates local directory 
__package__ = ["package_name"] 

모든 것이 올바르게 실행됩니다. 그러나, 그 파일에서 나는이 줄을 넣어 : print(__name__)

출력은 문자열입니다!

package_name 
__main__ 

나는 패키지에의 직접 실행되고 있기 때문에이 그냥 의심,하지만 어떻게 if __name__ == "__main__": 그런 짓을합니까? 심지어 변수에 할당 된 두 개의 문자열을 가질 수 있는지 이해가 안

print(repr(__name__)) 
# output 
'package_name' 
'__main__' 

print(__name__.endswith("__main__")) 
# output 
False 
True 

print(type(__name__)) 
# output 
<class 'str'> 
<class 'str'> 

:

는 여기가 __name__ VAR 더 주위에 엉망이 좀 더 출력입니다. 무슨 일 이니? 이 알려진 파이썬 문제가 ... __main__로 실행 파일은 다음과 같다

+0

이 파일이 실제로 두 번 실행되는 것 같습니다. 수입 시스템을 혼란에 빠뜨릴 수있는 몇 가지 방법이 있습니다. – user2357112

+0

훨씬 쉬운 방법은 패키지 내용을 직접 실행하지 않고 동일한 파일을 가져올 수있는 모듈과 스크립트로 만들려고하지 않는 것입니다. – user2357112

+0

@ user2357112 두 번 실행하면 어떻게 될지 생각할 수 있습니다. 그리고 당신의 다른 코멘트에 대한 응답으로, 나는 그것이 지금 내가해야 할 일이라고 생각합니다. 파일이 실행 가능한 스크립트가 될 필요는 없습니다. 실행 된 경우 오류가 발생하지 않도록 관심이있었습니다. 도와 주셔서 감사합니다! – Cole128

답변

0

가 주어진 이름으로 모듈을 가져 오는 -m 플래그 (실행하지 않는 한 그들의 상대적으로 수입이 다음의 __name__이로 실행 변경 수 없습니다 __main__. 기본의 PyDev으로

그냥 정기적으로 파일을 실행합니다,하지만 당신은 또한 (preferences > PyDev > Run > Launch modules with "python -m mod.name" 참조) 계산 된 모듈 이름으로 파일을 실행하도록 요청할 수 있습니다.

을 개인적으로, 나는 당신이 상대적으로 수입을 두지 않는 것이 좋습니다 __main__ 모듈에 있습니다 (사용자가 모듈을로 실행할 수 없으므로).또한 -m 플래그로 실행해야합니다.)하지만 괜찮 으면 PyDev에서 해당 옵션을 활성화 할 수 있습니다.

+0

이미 pydev에서 해당 기능을 활성화했습니다. 이것은 또한'__main__'으로 실행되는 파일이 아니며 오류없이 실행할 수 있기를 원했습니다. 이/전혀 요지를 피할 수있는 쉬운 방법이 없다면 @ user2357112가 제안한대로 의도 한대로 모듈로 사용하게 될 것입니다. – Cole128