파이썬에서 파일 이름을 가져 오는 방법은 숫자로 시작합니다.


82

기본적으로라는 파일이 있으며 파일 8puzzle.py을 다른 파일로 가져오고 싶습니다 (동일한 폴더에 있으며 파일이 제공되므로 파일 이름을 변경할 수 없습니다). 어쨌든 파이썬에서 이것을 할 수 있습니까? 나는 평소 방법을 시도했지만 from 8puzzle import *오류가 발생합니다.

오류 :

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 

12
왜 사람들은 "나에게 [오류가 있습니다]"라고 말하고 오류가 무엇인지 게시하지 않습니까?
John Zwinck

7
@JohnZwinck 구문 오류입니다. "8puzzle"은 유효한 식별자 (숫자로 시작)가 아니기 때문에 추측하고 있으며 import 문의 구문은 거기에 Python 식별자를 예상합니다. "아니요, 할 수 없습니다. 모듈 이름을 문자 나 밑줄로 시작하는 이름으로 바꾸십시오."라는 대답이됩니다.
millimoose

John이 좋은 지적을했습니다. 명심할 것입니다. 그리고 Abhijeet에게 오류 메시지를 추가해 주셔서 감사합니다. 감사.
Simon Guo

1
이름 바꾸기 8puzzle.pypuzzle8.py사용 import puzzle8.
Bakuriu

답변:


94

당신은 할 수 있습니다

puzzle = __import__('8puzzle')

매우 흥미로운 문제입니다. 번호로 이름을 지정하지 않는 것을 기억할 것입니다.

원하는 경우이 질문과 답변을 확인import * 해야합니다 .


1
잘 작동합니다! 감사. 네, 숫자로 시작하는 이름을 붙이지 않겠 습니다만 코스 과제물 유인물 파일이므로 변경할 수 없습니다. 그러나 우리가 이미 그것에 대한 해결책을 얻었 기 때문에 그것은 중요하지 않은 것 같습니다. 다시 한번 감사드립니다.
Simon Guo

4
세상을 구하거나 적어도 반 친구들을 구하십시오. 불가능한 수입품을 받으면 강사에게 가져 가십시오. 예, 때때로 그들은 틀린 것을 싫어합니다. 그러나 만약 당신이이 문제를 가지고 있다면 다른 모든 사람들도 그렇습니다. 그리고이 대답은 작동하지만 올바른 해결책은 아닙니다 (클래스가 "Obfuscated Python 101"이 아니라면).
msw

1
더 나은 방법 (적어도 python 2.7 포함)은 'importlib'모듈을 사용하는 것입니다. puzzle = importlib.import_module ( '8puzzle')
Cédric

3
실제로 이것에 대한 좋은 사용 사례가 있습니다. 컴파일 / 생산 과정의 일부로, 파이썬 모듈을 어휘 형식으로 명명하면 함께 연결하는 것이 가장 쉽습니다 (일반적으로 중요하지 않지만 상수와 가져 오기는 'if name '). '하단에'0 '으로 시작하는 몇 가지 모듈이 유용 할 수 있습니다.) inotify 또는 watch와 함께 사용하면 이러한 비정상적인 디렉토리 레이아웃을 디버깅하는 데에도 유용합니다. watch -n .1'cat * | python ', 이는 10 분의 1 초마다 (또는 최소한 가능한 한 빨리) Python 앱을로드합니다. 또는 : cat $ (find. -name "* .py") | python
fatal_error 2015 년

1
파티에 늦었지만 Alembic 마이그레이션에서 가져 오는 또 다른 사용 사례가 있습니다. 모두 임의 해시로 시작하기 때문입니다
kevlarr

35

위의 답변은 정확하지만 지금은 import_module기능 을 사용하는 것이 좋습니다 .

importlib.import_module(name, package=None)
모듈을 가져옵니다. name 인수는 절대 또는 상대 용어 (예 : pkg.mod또는 ..mod) 로 가져올 모듈을 지정합니다 . 이름이 상대적인 용어로 지정되면 패키지 인수는 패키지 이름을 확인하기위한 앵커 역할을 할 패키지의 이름으로 설정되어야합니다 (예 : import_module('..mod', 'pkg.subpkg')import pkg.mod).

import_module () 함수는 importlib.__import__(). 이것은 함수의 모든 의미가 importlib.__import__(). 이 두 함수의 가장 중요한 차이점 import_module()은 지정된 패키지 또는 모듈 (예 :) pkg.mod__import__()반환하는 반면 최상위 패키지 또는 모듈 (예 :) 을 반환한다는 것 pkg입니다.

인터프리터가 실행을 시작한 이후로 생성 된 모듈을 동적으로 가져 오는 경우 (예 : Python 소스 파일 생성) invalidate_caches()가져 오기 시스템에서 새 모듈을 인식 하도록 호출해야 할 수 있습니다.

__import__ 지금은 권장하지 않습니다.

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
내장 __import__()함수 의 구현입니다 .

참고 모듈의 프로그래밍 방식 가져 오기 import_module()는이 함수 대신 사용해야 합니다.


덕분에 작동하지만 숫자로 시작하는 이러한 파일 중 하나 내에서 함수 또는 변수를 가져 오는 것은 작동하지 않습니다. 할 경우 : an_imported_file = importlib.import_module('13_file'), 할 수 없습니다 from an_imported_file import var_x. 이를 달성하기 위해 할 수있는 일이 있습니까?
Martin

/usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in <module> from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
Martin

또한 Pycharm의`from an_imported_file import var_x`행은 빨간색으로 밑줄이 그어져 있습니다.
Martin

미안한 줄 몰라요. 나의 일반적인 조언은 이것을 피하는 것입니다.
laike9m

0

사용하지 마십시오 .py가져 오기에 확장자를 .

합니까의 from 8puzzle import *작업?

그만한 가치 from x import *가있는 것은 해당 모듈의 네임 스페이스를 현재 컨텍스트로 블리드하기 때문에 선호되는 Python 패턴이 아닙니다.

일반적으로 해당 모듈에서 특별히 원하는 것을 가져 오십시오. 다른 모듈의 모든 글로벌을 가져올 수 있습니다.

예를 들어, 만약 당신이 8puzzle.foo`from 8puzzle import

편집하다:

.py메시지는 정확 하지만 충분하지 않습니다.

다른 포스터의 __import__('8puzzle')제안이 맞습니다. 하나, 패턴을 피하는 것이 좋습니다 .

하나는 내부 비공개 Python 메서드로 예약되어 있습니다. 기본적으로 모듈을 가져올 수 있다는 것이 의미하는 기본 가정을 깨고 있습니다. 파일 이름을, 같은 다른 이름으로 변경 puzzle8하면 문제가 해결됩니다.

이것은 수입품이 무엇인지 알고 있고 코드가 PEP8을 준수하기를 기대하는 경험 많은 Python 프로그래머를 좌절시킬 것 입니다.


1
혼란스러워서 죄송합니다. 내가 한 일은이었다 from 8puzzle import *그리고 나는 나의 원래의 질문을 편집했다. 그리고 그것은 mvanveen이 말한 것처럼 작동하지 않습니다.
Simon Guo

그것은 내 잘못입니다. 모듈 파일 이름이 숫자로 시작할 수 없다는 것을 잊었습니다. 편집을 게시했습니다.
mvanveen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.