2017-10-27 2 views
0

나는 this question을 알고 있지만 작동하지 않을뿐만 아니라 내가 원하는 것만은 아닙니다. 레이싱 게임을 개발 중이며 폴더의 모든 트랙을 동적으로로드하려고합니다 (.json 대신 .py로 저장 됨). 트랙의 이름을 알고 싶지는 않습니다. 사용자가 자유롭게 모드를 변경하거나 추가 할 수 있기 때문입니다. 데이터 만 가져 오려고합니다. 따라서, 예를 들어 :폴더에서 모든 모듈을 동적으로 가져 오기

>tracks 
>>track0.py 
>>track1.py 
>>track2.py 
>>track3.py 
>>track4.py 

각 트랙 내부,이 같은 데이터를 가지고 :

track_ground_data = [ 
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1], 
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], 
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1], 
    [1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1], 
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
] 

내가 같이 각 트랙 모듈을 가져와야 : 액세스 다음

loaded_tracks = [t for t in tracks] # Where tracks is the folder. 

을 그리고 track_ground_data이 다음과 같이 주어진다 :

loaded_tracks[0].track_ground_data 

Python이 그 수입에 너무 가혹하다는 것을 알았다면, 대신 json을 사용했을 것입니다.

+0

예. 나는이 코드를'__init __. py' 파일에 넣었고, 트랙 ('import tracks') :'tracks.track0'을 가져 오려고하면'AttributeError'를 얻습니다. –

+0

맞아요. 아마도 .py 파일 대신 데이터를 저장하기 위해 고안된 파일 형식을 사용해야했을 것입니다 ... – martineau

+0

[내 대답] (https://stackoverflow.com/a/14428820/355230) 패키지 관련 질문 – martineau

답변

1

아니요 패키지에 포함 된 하위 모듈을 자동으로 가져옵니다. 따라서 import tracks로드 tracks/__init__.py.

__init__.py 파일 내에 코드를 넣으면 해당 디렉토리에서 찾은 모든 모듈을 가져옵니다. __init__.py이 같은 퍼팅 예를 들어

: 만 tracks을 가져올 때

import os 
import importlib 

__globals = globals() 

for file in os.listdir(os.dirname(__file__)): 
    mod_name = file[:-3] # strip .py at the end 
    __globals[mod_name] = importlib.import_module('.' + mod_name, package=__name__) 

tracks.trackX 같은 서브 모듈을 사용할 수 있도록해야한다.

아니면 exec을 사용할 수

import os 
import importlib 

for file in os.listdir(os.dirname(__file__)): 
    mod_name = file[:-3] # strip .py at the end 
    exec('import .' + mod_name) 

클리너 접근 방식은 수입 후크를 사용하거나 사용자 정의 모듈 수입을 구현하는 것입니다. importlib을 사용하여 여러 가지 방법을 참조하십시오. sys.path_hooks

1

동적으로 모듈을 가져 오는 문제는 일반적으로 커뮤니티에 기여할 수있는 플러그인 또는 시스템이 프레임 워크에있을 때 발생합니다. 각 플러그인 또는 애드온은 프레임 워크 아키텍처 및 API를 준수하는 클래스 및 기능을 포함하는 모듈입니다.

프레임 워크 코드와 임의로 많은 추가 기능 사이의 "점을 결합하는"솔루션은 파이썬 표준 라이브러리에있는 importlib을 사용하는 것입니다. 당신은 똑같은 구조적인 문제에 직면 해있는 것처럼 보입니다.

다음은 importlib으로 응답 된 stackoverflow question입니다. 그리고 documentation.

0

미래 pythoners의 좋은 휴양을 위해서, 내가 어떻게 해결했는지 게시하고 있습니다. 친구가 그것을 통해 나를 도왔다. 모듈이 비어 있었기 때문에 Bakuriu의 솔루션을 작동시키지 마십시오.

import os 

dir = os.path.dirname(os.path.abspath(__file__)) 
modules = [os.path.splitext(_file)[0] for _file in os.listdir(dir) if not _file.startswith('__')] 

tracks = [] 
for mod in modules: 
    exec('from tracks import {}; tracks.append({})'.format(mod, mod)) 

을 그리고, 주 파일에, 나는로로드 한 : __init__.py 내부 내가 넣었습니다 다음

dir = os.path.dirname(os.path.abspath(__file__)) 
sys.path.append(dir) 

from tracks import tracks 

: 그리고 실제로 그것을 해결

loaded_tracks = [t for t in tracks] 

아주 잘. 거의 JSON으로 전환/포기했습니다.

관련 문제