모듈 이름에 '-'대시 또는 하이픈이있는 경우 모듈을 가져 오는 방법은 무엇입니까?


195

foo-bar.py를 가져오고 싶습니다. 이것은 작동합니다 :

foobar = __import__("foo-bar")

이것은하지 않습니다 :

from "foo-bar" import *

내 질문 : 위의 형식을 사용하여 from "foo-bar" import *모듈이있는 모듈을 가져올 수있는 방법이 -있습니까?


10
왜 이름에 대시가있는 모듈이 있습니까?
Matti Virkkunen

23
원래 모듈이 아닌 스크립트로 작성된 것 같습니다.
Michael Hoffman


win32com의 @MattiVirkkunen makepy.py는 대시가있는 모듈을 생성합니다. 너무 나쁘다. comtypes는 밑줄로 변환하여이 문제를 해결했습니다
swdev

2
@MattiVirkkunen 파이썬이 디렉토리에 부여 할 수있는 이름을 제한해서는 안된다고 생각합니다. 그렇게하는 것은 책임이 없습니다.
Zelphir Kaltstahl

답변:


117

당신은 할 수 없습니다. foo-bar식별자가 아닙니다. 파일 이름을foo_bar.py

편집 :import 목표가 아닌 경우 (에서와 같이 무슨 일이 일어나 든 sys.modules상관없고 가져 오기 위해 필요하지 않음) 파일의 모든 전역을 자신의 범위로 가져 오기만하면 사용할 수 있습니다execfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 

24
Python 3.x Python 3.0의 새로운 기능 execfile ()을 제거했습니다. 대신 execfile(fn)사용 exec(open(fn).read())또한 패키지 importlib있다.
DevPlayer

106

Python 이름 지정 규칙과 일치하도록 모듈의 이름을 바꿀 수없는 경우 중개자 역할을 할 새 모듈을 작성하십시오.

 ---- foo_proxy.py ----
 tmp = __import__('foo-bar')
 globals().update(vars(tmp))

 ---- main.py ----
 from foo_proxy import * 

30
나는 이것을 결코 구현하지 않을 것이다. 그러나 나는이 해킹의 깎아 지른듯한 광택을 위해 일을 포기하지 수 없습니다
inspectorG4dget

11
당신은 실제로하지 않고이 작업을 수행 할 수 foo_proxy.py의 출력 할당 파일 __import__(...)을을 sys.modules['foo_proxy']. 사실, 그렇게하지 마십시오. 끔찍한 생각입니다.
SingleNegationElimination 14

3
내가 찾던 것을 시원하게. 배포판과 함께 제공되는 기본 라이브러리를 사용하는 경우 유스 케이스가 있습니다.
Sven


46

원본 파일의 이름을 바꿀 수 없으면 심볼릭 링크를 사용할 수도 있습니다.

ln -s foo-bar.py foo_bar.py

그럼 당신은 할 수 있습니다 :

from foo_bar import *

2

다른 사람이 파이썬 명명에서 "-"를 사용할 수 없다고 말한 것처럼 많은 해결 방법이 있습니다. 하나의 해결 방법은 경로에서 여러 모듈을 추가 해야하는 경우 유용합니다. sys.path

예를 들어 구조가 다음과 같은 경우 :

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

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