파이썬 파일을 가져올 때 대시 파일을 사용해도 괜찮습니까?


149

기본적으로 파이썬 파일이있을 때 :

python-code.py

그리고 사용 :

import (python-code)

인터프리터에서 구문 오류가 발생합니다.

그것을 고치는 방법에 대한 아이디어가 있습니까? 파이썬 파일 이름에서 대시는 불법입니까?

답변:


167

Python 코드 용 스타일 가이드 PEP 8을 확인해야합니다 .

패키지 및 모듈 이름 모듈은 소문자로 된 짧은 이름이어야합니다. 가독성을 높이려면 모듈 이름에 밑줄을 사용할 수 있습니다. 밑줄은 사용하지 않는 것이 좋지만 파이썬 패키지는 소문자로 된 짧은 소문자 이름을 가져야합니다.

모듈 이름은 파일 이름에 매핑되고 일부 파일 시스템은 대소 문자를 구분하지 않고 긴 이름을 자르기 때문에 모듈 이름을 상당히 짧게 선택하는 것이 중요합니다. 이는 Unix에서 문제가되지 않지만 코드가 이전 Mac 또는 Windows 버전 또는 DOS로 전송 될 때 문제가 발생합니다.

즉, 파일 이름을 바꾸십시오 :)


75
문제는 스타일과 관련이 없으며 구문 오류입니다

4
아래에 표시된 것처럼이 이름의 파일을 계속 사용할 수 있으므로 스타일 가이드가 매우 관련이 있습니다.
Paolo Bergantino

5
가져 오기를 명시 적으로 방지하려는 경우 Python 디렉토리 및 파일 이름에 하이픈을 사용하면 매우 유용합니다. 예를 들어 Django 프로젝트에서 응용 프로그램으로 처리 할 수없는 Python으로 작성된 스크립트가있을 수 있습니다. 이것들을 폴더에 넣고 ops-scripts일반적인 패키지 네임 스페이스 접근 방식을 사용하여 가져올 수 없다는 것을 알 수 있습니다. 또는 stop-website.py비슷한 효과를 위해 단일 스크립트의 이름 을 지정할 수 있습니다 . 이들 runpy중 하나는 물론 다른 방법을 통해 가져올 수 있지만 일반적인 오류를 피하는 데 도움이됩니다.
Chris Johnson

모듈의 이름을 바꾸면 특히 다른 표준에 의존하는 경우 문제가 될 수 있습니다. 필자의 경우 cgi-bin폴더 에 python cgi 파일을 사용 하고 있습니다 (단일 테스트 수행). 이와 같이 드문 경우가 아니라면 제어 할 수있는 경우 모듈 이름을 변경하십시오.
NuclearPeon

1
방금 PyDev가 하이픈으로 디렉토리 이름을 허용하지만 해당 디렉토리에 포함 된 .py 파일의 클래스 및 / 또는 내부 변수를 표시하지 않음을 발견했습니다.
user5920660

123

코드에서 주목해야 할 또 다른 사항은 가져 오기가 함수가 아니라는 것입니다. 그래서 import(python-code)해야합니다 import python-code일부는 이미 언급 한 바와 같이, "수입 파이썬을 뺀 코드"로 해석되는, 당신은 아닙니다 무엇. 이름에 대시가있는 파일을 실제로 가져와야하는 경우 다음을 수행 할 수 있습니다.

python_code = __import__('python-code')

그러나 위에서 언급했듯이 이것은 권장되지 않습니다. 제어하는 파일 이름 인 경우 파일 이름을 변경해야합니다.


@KevinAudleman 하이픈 파일과 함께 import lib를 사용하는 실제 예제가 있습니까? 시도하고 실패했습니다.
Tom Hale

@TomHale importlib.import_module ( 'abmodule-1')이 작동해야합니다. import_module이 작동하지 않으면 일반 가져 오기도 작동하지 않는다고 생각합니다.
Ian Lin

64

TLDR

대시는 없습니다 불법하지만 당신은 3 개 이유로이를 사용하지 않아야합니다 :

  1. 대시가있는 파일을 가져 오려면 특별한 구문이 필요합니다
  2. 아무도 대시가있는 모듈 이름을 기대하지 않습니다.
  3. 파이썬 스타일 가이드 의 권장 사항에 위배됩니다.

대시가있는 파일 이름을 반드시 가져와야하는 경우 특수 구문은 다음과 같습니다.

module_name = __import__('module-name')

왜 특별한 문법이 필요한지 궁금하십니까?

특수한 구문의 이유 import somename는 작성시 식별자가있는 모듈 객체를 생성하기 somename때문에 나중에 예를 들어이를 사용할 수 있기 때문입니다 somename.funcname. 물론 module-name유효한 식별자가 아니므로 유효한 구문을 제공하는 특수 구문입니다.

module-name이 유효한 식별자가 아닌 이유를 알 수 없습니까?

걱정하지 마십시오. 다음은 도움이되는 팁 x=var1-var2입니다. 이 Python 행을보십시오 . 과제 오른쪽에 뺄셈이나 대시가있는 변수 이름이 있습니까?

추신

한 곳에서 다른 모든 답변에서 가장 관련성이 높은 정보로 간주되는 것을 포함하여 내 답변에 독창적 인 것은 없습니다.


하이픈으로 pip 패키지를 가져 오려고합니다. psycopg2_binary = import_module('psycopg2-binary'). 오류 => ModuleNotFoundError: No module named 'psycopg2-binary'. 그러나 psycopg2-binary설치되어 있습니다. 그것을 포함하는 방법을 모른다.
Mote Zart

경로 문제 일 수 있습니다. chrisyeh96.github.io/2017/08/08/…
ndemou

32

문제는 python-code식별자가 아닙니다. 파서는 이것을 python마이너스 로 본다 code. 물론 이것은 당신이 요구하는 것을하지 않을 것입니다. 유효한 파이썬 식별자 인 파일 이름을 사용해야합니다. -밑줄로 바꾸십시오 .


4
+1. 파이썬 소스 코드 의 파일 이름 이 유효한 식별자 여야한다고 생각하지 마십시오 . 파일 이름 이 모듈 객체를 참조하는 데 사용됩니다.
andy

5

아마도 __import__해킹을 통해 가져올 수 있지만 방법을 아직 모른다면 안됩니다. 파이썬 모듈 이름은 유효한 변수 이름 ( "식별자")이어야합니다. 즉, 모듈이 있으면 foo_bar파이썬 ( print foo_bar) 내에서 사용할 수 있습니다 . 이상한 이름 ( print foo-bar-> 구문 오류) 으로는 그렇게 할 수 없습니다 .


5

Python 3에서는 import_module을 사용 하십시오 .

from importlib import import_module
python_code = import_module('python-code')

더 일반적으로,

import_module('package.subpackage.module')

1

적절한 파일 이름을 지정하는 것이 가장 좋은 방법이지만, python-code통제 __import__할 수없는 경우 다른 작성자의 코드를 복사하거나 이름을 바꾸거나 다른 방법 으로 해킹하는 것보다 해킹을 사용하는 것이 좋습니다. 그러나 .py확장을 추가하여 파일 이름을 바꾸지 않으면 시도했지만 작동하지 않았습니다 . 에 대한 설명을 얻는 방법을 도출하기 위해 문서 를 살펴본 .py결과 다음과 같이 끝났습니다.

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

python-codec첫 번째 실행 에서 새 파일 을 작성했습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.