누군가 모듈의 전체 디렉토리를 가져 오는 좋은 방법을 제공 할 수 있습니까?
나는 이와 같은 구조를 가지고있다 :
/Foo
bar.py
spam.py
eggs.py
추가 __init__.py
하고 수행 하여 패키지로 변환하려고했지만 from Foo import *
원하는 방식으로 작동하지 않았습니다.
답변
.py
현재 폴더의 모든 python ( ) 파일을 나열하고 __all__
변수로 넣습니다 .__init__.py
from os.path import dirname, basename, isfile, join
import glob
modules = glob.glob(join(dirname(__file__), "*.py"))
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]
답변
포함 할 __all__
변수를 추가하십시오 __init__.py
.
__all__ = ["bar", "spam", "eggs"]
참조 http://docs.python.org/tutorial/modules.html
답변
2017 년 업데이트 : 아마도 importlib
대신 사용하고 싶을 것입니다.
를 추가하여 Foo 디렉토리를 패키지로 만듭니다 __init__.py
. 그 __init__.py
추가 :
import bar
import eggs
import spam
동적이기를 원하기 때문에 (좋은 아이디어 일 수도 있고 아닐 수도 있음) 모든 py 파일을 list dir로 나열하고 다음과 같이 가져 오십시오.
import os
for module in os.listdir(os.path.dirname(__file__)):
if module == '__init__.py' or module[-3:] != '.py':
continue
__import__(module[:-3], locals(), globals())
del module
그런 다음 코드에서 다음을 수행하십시오.
import Foo
이제 다음을 사용하여 모듈에 액세스 할 수 있습니다
Foo.bar
Foo.eggs
Foo.spam
등 from Foo import *
이름 충돌을 포함하고 하드 코드를 분석 할 수있게 몇 가지 이유에 대한 좋은 생각이 아니다.
답변
Mihail의 답변을 확장하여 파일 경로를 직접 처리하지 않는 것처럼 해킹이 아닌 방법은 다음과 같습니다.
__init__.py
아래에 빈 파일을 만듭니다Foo/
- 실행
import pkgutil
import sys
def load_all_modules_from_dir(dirname):
for importer, package_name, _ in pkgutil.iter_modules([dirname]):
full_package_name = '%s.%s' % (dirname, package_name)
if full_package_name not in sys.modules:
module = importer.find_module(package_name
).load_module(full_package_name)
print module
load_all_modules_from_dir('Foo')
당신은 얻을 것이다:
<module 'Foo.bar' from '/home/.../Foo/bar.pyc'>
<module 'Foo.spam' from '/home/.../Foo/spam.pyc'>
답변
파이썬, 디렉토리 아래에 모든 파일을 포함하십시오 :
손을 잡아야하는 사람이 일을 할 수없는 초보자에게 적합합니다.
-
/ home / el / foo 폴더를 만들고 / home / el / foo
main.py
아래 에 파일을 만듭니다. 이 코드를 여기에 넣으십시오.from hellokitty import * spam.spamfunc() ham.hamfunc()
-
디렉토리 만들기
/home/el/foo/hellokitty
-
__init__.py
아래 에 파일 을/home/el/foo/hellokitty
만들고이 코드를 넣으 십시오 .__all__ = ["spam", "ham"]
-
이 개 파이썬 파일을 확인하십시오
spam.py
및ham.py
아래/home/el/foo/hellokitty
-
spam.py 내부에 함수를 정의하십시오.
def spamfunc(): print("Spammity spam")
-
ham.py 안에 함수를 정의하십시오 :
def hamfunc(): print("Upgrade from baloney")
-
그것을 실행 :
el@apollo:/home/el/foo$ python main.py spammity spam Upgrade from baloney
답변
나는이 문제에 스스로 지쳤다. 그래서 automodinit라는 패키지를 작성하여 고쳤다. http://pypi.python.org/pypi/automodinit/ 에서 얻을 수 있습니다 .
사용법은 다음과 같습니다.
automodinit
패키지를setup.py
종속성에 포함하십시오 .- 다음과 같이 __init__.py 파일을 모두 바꾸십시오.
__all__ = [ "다시 작성하겠습니다"] # 위의 줄이나이 줄을 수정하지 마십시오! 가져 오기 automodinit automodinit.automodinit (__ name__, __file__, globals ()) 델 자동 모드 # 당신이 원하는 다른 것은 여기에 갈 수 있습니다, 그것은 수정되지 않습니다.
그게 다야! 이제 모듈을 가져 오면 __all__이 모듈의 .py [co] 파일 목록으로 설정되고 입력 한 것처럼 각 파일을 가져옵니다.
for x in __all__: import x
따라서 “from M import *”의 효과는 “import M”과 정확히 일치합니다.
automodinit
ZIP 아카이브 내부에서 실행하는 것이 행복하므로 ZIP 안전합니다.
닐
답변
나는 꽤 오래된 게시물을 업데이트하고 있다는 것을 알고 있으며을 사용하려고 시도했지만 automodinit
python3의 설정 프로세스가 깨졌습니다. 따라서 Luca의 답변을 바탕 으로이 문제에 대한 .zip과 작동하지 않을 수있는 더 간단한 답변을 찾았으므로 여기에서 공유해야한다고 생각했습니다.
__init__.py
모듈 내 에서 yourpackage
:
#!/usr/bin/env python
import os, pkgutil
__all__ = list(module for _, module, _ in pkgutil.iter_modules([os.path.dirname(__file__)]))
아래의 다른 패키지 내에서 yourpackage
:
from yourpackage import *
그런 다음 패키지 내에 배치 된 모든 모듈을로드하고 새 모듈을 작성하면 자동으로 가져옵니다. 물론 큰 힘을 가지고 조심스럽게 그런 일을하는 것은 큰 책임이 따릅니다.