죄송합니다. 이미 용어를 사용하여 답변을 얻었다면 검색 할 필요가 없습니다.Python - 패키지 모듈을 독립 실행 형으로 사용하는 경우 패키지를 가져 오는 경우?
나는 하나 개의 프로젝트를 가지고 : class2
이 class1
에서 몇 가지를 수입하고 있지만, 각 내가 실행 자주 각각의 클래스를 사용하여 자신의 if __name__ == '__main__'
을 가지고
project1/
class1.py
class2.py
. 그런 다음 두 번째 프로젝트에서 각 클래스의 하위 클래스를 만듭니다 (project1
). 그래서 나는 내가 잘 project2
로 가져올 수 있도록 패키지로 project1
싶습니다 :
project2/
project1/
__init__.py
class1.py
class2.py
subclass1.py
subclass2.py
을하지만, 나는이 함께 오기에 문제가 있어요. 내가 project1
패키지를 만든 경우 class2.py
class1.py
코드를 from project1.class1 import class1
으로 가져오고 싶습니다. 이로 인해 project2
코드가 올바르게 실행됩니다. 하지만 이제 project1
을 패키지로 사용하지 않고 해당 디렉토리에서 코드를 직접 실행하면 project1
코드가 실패합니다 (그 이유는 무엇이 project1
인지 모르기 때문입니다). 해당 디렉토리에서 project1
을 직접 설정하면 (즉, class2
의 가져 오기는 from class1 import Class1
임) project2
에서 project1
을 패키지로 사용하려고하면 가져 오기가 실패합니다.
두 가지 방법이 있습니다 (project1
을 패키지로 사용하고 패키지로 사용하지 마십시오)? 방법이 있다면, 실망스럽고 어쨌든 코드를 재구성해야합니까? 이걸 어떻게 처리해야하는지에 대한 다른 제안들? 감사!
편집 그냥, 분명히 문제 arrises class2
subclass2
수입 때문에 할 차례 수입 class1
인치 어떤 방법으로 class2
을 가져 오는 경우 class1
project2
또는 project1
에서 가져 오기가 실패합니다. 즉, project1
을 패키지로보고 다른 하나는 작업 디렉토리로 간주하기 때문입니다.
편집 2
내가 파이썬 3.5를 사용하고 있습니다. 외관상으로는 이것은 파이썬 2에서 작동하지만 파이썬의 현재 버전에서는 작동하지 않습니다.
요청의 뉘앙스가 누락 된 것인지 잘 모르겠지만 'project1 import class1'을 사용하여 project1 클래스를 project2로 가져온 다음 class1.function()을 통해 코드를 사용할 수 있습니다. 각각의 파일에서'if __name__ == "__main __"'을 (를) 가지고 있어도 상관이 없습니다 ... class1을 class2로 가져 오는 것은 여전히'class1 import function'에서입니다. – chrxr
@chrxr :'project2'에서'class2'를 가져 오려고하면 문제가 생깁니다. 'class2'는'class1'을 임포트하기 때문에 class2 내에서 import *를 어떻게 preform 할 것인가에 따라 import는'project2'의 관점에서 실패 할 것입니다 ('class1 import Class1'로부터 임포트한다면) 또는'project1' '(project1.class1 import class1'에서 가져올 경우). 이는 가져 오기 체인이 있기 때문입니다. 'subclass2' imports'class2'는'class1'을 수입합니다. –
서브 모듈을 실행하려면'-m' 스위치를 사용해야합니다. 나는. 'python/path/to/my/package1/class1.py'를 실행하는 대신에'python -m package1.class1'을 실행해야합니다 (물론'package1' 패키지는'PYTHONPATH'에 있어야합니다. 그렇지 않으면 부모에 있어야합니다 예배 규칙서). 그건 그렇고, 나는 단순히 당신이하는 일을 피할 것입니다 : 클래스 정의와 스크립트를 명확하게 분리하고 결코'package1'을 실행하지 마십시오. 'package1'에서 클래스를 가져오고 수행해야 할 작업을 수행하는 * 별도의 * 파일을 작성하십시오. 간단하고 간단하며 오류가 발생하지 않는 파일 일뿐입니다. – Bakuriu