[python] 폴더에 모든 모듈을로드하는 방법은 무엇입니까?

누군가 모듈의 전체 디렉토리를 가져 오는 좋은 방법을 제공 할 수 있습니까?
나는 이와 같은 구조를 가지고있다 :

/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의 답변을 확장하여 파일 경로를 직접 처리하지 않는 것처럼 해킹이 아닌 방법은 다음과 같습니다.

  1. __init__.py아래에 빈 파일을 만듭니다Foo/
  2. 실행
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'>


답변

파이썬, 디렉토리 아래에 모든 파일을 포함하십시오 :

손을 잡아야하는 사람이 일을 할 수없는 초보자에게 적합합니다.

  1. / home / el / foo 폴더를 만들고 / home / el / foo main.py아래 에 파일을 만듭니다. 이 코드를 여기에 넣으십시오.

    from hellokitty import *
    spam.spamfunc()
    ham.hamfunc()
    
  2. 디렉토리 만들기 /home/el/foo/hellokitty

  3. __init__.py아래 에 파일 을 /home/el/foo/hellokitty만들고이 코드를 넣으 십시오 .

    __all__ = ["spam", "ham"]
  4. 이 개 파이썬 파일을 확인하십시오 spam.pyham.py아래/home/el/foo/hellokitty

  5. spam.py 내부에 함수를 정의하십시오.

    def spamfunc():
      print("Spammity spam")
    
  6. ham.py 안에 함수를 정의하십시오 :

    def hamfunc():
      print("Upgrade from baloney")
    
  7. 그것을 실행 :

    el@apollo:/home/el/foo$ python main.py 
    spammity spam
    Upgrade from baloney
    

답변

나는이 문제에 스스로 지쳤다. 그래서 automodinit라는 패키지를 작성하여 고쳤다. http://pypi.python.org/pypi/automodinit/ 에서 얻을 수 있습니다 .

사용법은 다음과 같습니다.

  1. automodinit패키지를 setup.py종속성에 포함하십시오 .
  2. 다음과 같이 __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 안전합니다.


답변

나는 꽤 오래된 게시물을 업데이트하고 있다는 것을 알고 있으며을 사용하려고 시도했지만 automodinitpython3의 설정 프로세스가 깨졌습니다. 따라서 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 *

그런 다음 패키지 내에 배치 된 모든 모듈을로드하고 새 모듈을 작성하면 자동으로 가져옵니다. 물론 큰 힘을 가지고 조심스럽게 그런 일을하는 것은 큰 책임이 따릅니다.