2009-06-25 7 views
28

기본 모듈을 사용하는 Python 스크립트가 있지만 기본 스크립트 자체와 동일한 디렉토리에있는 많은 사용자 정의 모듈도 가져옵니다.다른 작업 디렉토리에서 Python 모듈 가져 오기

예를 들어, 나는

python agent.py 

를 부를 것이다 및 agent.py을 포함, 수입의 번호를 가지고 : 검사 agent.py과 같은 디렉토리에있는 파일에

import checks 

agent/agent.py 
agent/checks.py 

현재 작업 디렉토리가 /이면 모든 것이 정상입니다. 그러나 다른 디렉토리에서 agent.py를 호출하면 분명히 checks.py를 가져올 수 없으므로 오류가 발생합니다.

agent.py가 어디에서 호출되었는지에 관계없이 어떻게 맞춤 모듈을 가져올 수 있는지 어떻게 확인할 수 있습니까?

python /home/bob/scripts/agent/agent.py 
+0

결과는 무엇 이었습니까? Amn 대답을 수락 할 계획입니까? –

+0

몇 주 동안하지 않을 코드를 사용해 본 후에 대답을 받아 들일 것입니다. 나는 특별한 서두가 없다. – DavidM

+0

코드를 사용해 보셨습니까? 제가 예를 지적하고 하나 또는 두 개의 다른 언급도했듯이, 당신이 한 말은 단지 일해야하고 일하는 것으로 문서화되어야합니다. "코드를 시험해보십시오"대신, 귀하의 질문 (플랫폼, 파이썬 버전, 전체 추적 및 오류 메시지)에 포함되어 있어야하는 기초 정보를 제안하고 기본 디버깅을 제안하십시오. 시간의 몇 분; 6 명의 사람들이 당신에게 대답을하기 위해 "급히"달려 들었다. –

답변

26

실제로 checks.py가 agent.py와 같은 디렉토리에 있기 때문에 checks.py가 이전 디렉토리에있었습니다 (예 :

agent/agent.py 
checks.py 

그런 다음 다음을 수행 할 수 있습니다 :

path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 
if not path in sys.path: 
    sys.path.insert(1, path) 
del path 

주에게 __file__의 사용을.

+0

델 경로에 대해 알아야 할 사항은 무엇입니까? 왜 그렇게 특별한가요? –

+0

@CharlieParker는'path' 변수를 지우는 곳입니다. 주위를 어슬렁 거리고 싶다면 괜찮습니다. –

+2

+1하지만 나와 같은 파이썬 초보자를 위해 'import os, sys'(따옴표없이)를 추가하는 것을 잊지 마세요. – icasimpan

6

sys.path 변수에 현재 실행중인 모듈의 경로를 추가해야합니다. 명령 줄에서 호출 했으므로 스크립트 경로는 항상 sys.argv [0]에 있습니다.

import sys 
import os 
sys.path.append(os.path.split(sys.argv[0])[0]) 

이제 가져 오기가 모듈을 검색 할 때 agent.py 파일을 호스팅하는 폴더에서도 찾습니다.

5

PYTHONPATH에는 여러 가지 방법으로 항목을 추가 할 수 있습니다.

읽기 http://docs.python.org/library/site.html

  1. 전에 스크립트를 실행에 PYTHONPATH 환경 변수를 설정합니다.

    PYTHONPATH에서 agent.py을 실행하려면 python -m agent을 입력하면됩니다.

  2. lib/site-packages 디렉토리에 .pth 개의 파일을 만드십시오.

  3. 모듈을 lib/site-packages에 설치하십시오.

11

sys.path를 사용하면 안됩니다. sys 용 Python 2.6 문서를 인용하자.경로 :

프로그램 시작,이 목록의 첫 번째 항목, 경로가 [0], 파이썬 인터프리터를 호출 에 사용 된 스크립트를 포함하는 디렉토리에 초기화되는

. 스크립트 디렉토리가 이 아닌 경우 (예 : 인터프리터가 대화식으로 호출되거나 스크립트가 표준 입력에서 읽혀지는 경우) path [0]은 빈 문자열입니다. 현재 디렉토리의 모듈을 먼저 검색하도록 Python에 지시합니다. PYTHONPATH의 결과로 항목이 삽입되기 전에 스크립트 디렉토리가 삽입됩니다.

=== amod.py === 
def whoami(): 
    return __file__ 

=== ascript.py === 
import sys 
print "sys.argv", sys.argv 
print "sys.path", sys.path 
import amod 
print "amod __file__", amod.whoami() 

=== result of running ascript.py from afar === 
C:\somewhere_else>\python26\python \junk\timport\ascript.py 
sys.argv ['\\junk\\timport\\ascript.py'] 
sys.path ['C:\\junk\\timport', 'C:\\WINDOWS\\system32\\python26.zip', SNIP] 
amod __file__ C:\junk\timport\amod.py 

그리고 그것은 않다면 다시 실행에 ... amod.pyc 과정의 마지막 행으로 변경됩니다. 이것은 참신한 것으로 보이지 않습니다. Python 2.1 및 1.5.2에서 작동합니다.

당신을위한 디버깅 힌트 : 내가 가진 것처럼 2 개의 간단한 파일을보십시오. -v와 -vv를 사용하여 파이썬을 실행 해보십시오. 전체 추적 및 오류 메시지와 두 파일을 포함하여 실패한 테스트의 결과를 보여주십시오. 실행중인 플랫폼과 파이썬 버전을 알려주십시오. checks.py 파일에 대한 사용 권한을 확인하십시오. 간섭을 일으키는 checks.something_else가 있습니까?

+0

나는 이것이 올바른 대답이되어야한다고 생각한다. OP는 다른 위치에서 스크립트를 가져 오는 것이 아니라 호출하는 것에 관해 명확하게 이야기한다. –

1

나는 당신이 적절한 Python 패키지로 에이전트 디렉토리를 만드는 것을 고려해야한다고 생각한다. 그럼 당신은 파이썬 경로의 아무 곳이 패키지를 배치하고 당신은 당신이 사용이 조리법을 check.py하는 전체 경로를 알고있는 경우 http://docs.python.org/tutorial/modules.html

1

를 참조

from agent import checks 

으로 검사를 가져올 수 있습니다 (http://code.activestate.com/recipes/159571/)

하는 경우 시스템 경로 -이 제조법 (http://code.activestate.com/recipes/52662/)에 디렉토리를 추가하려고합니다. 이 경우 AddSysPath 함수에이 값을 전달하면 응용 프로그램 디렉토리 (sys.argv [0])를 결정해야합니다. 제작 샘플을보고 싶다면 나중에이 글에 댓글을 달아주세요.

감사합니다.

0

귀하의 목표에 대한 이해를 일반화하기 위해 import custom_package_name을 사용하여 사용자 정의 패키지를 가져올 수 있기를 원합니다. 파이썬을 어디서 호출하든 상관없이 파이썬 스크립트가 어디에 있든간에.

많은 답변에서 제가 설명하려고하는 내용이 언급되어 있지만 대부분의 대답이 이전 지식을 많이 사용한다고 생각합니다. 내가 할 수있는 한 명백하게하려고 노력할 것이다.

import 문을 통해 사용자 지정 패키지를 가져올 수있게하려면 Python이 패키지를 검색하는 데 사용하는 경로를 통해 어딘가에 검색 할 수 있어야합니다. 파이썬은 실제로 여러 경로를 사용하지만, 우리는 sys.prefix (파이썬 인터프리터에서)의 출력을 /lib/pythonX.Y/site-packages (또는 창을 사용하는 경우 lib/site-packages)으로 결합하여 발견 할 수있는 것에 초점을 맞출 것입니다. 여기서 X.Y는 파이썬 버전입니다. 당신은 파이썬 3.5을 사용하는 경우

import sys 
your_path = sys.prefix + '/lib/pythonX.Y/site-packages' 
print(your_path) 

이 경로는 /usr/local/lib/python3.5/site-packages처럼 보일 것이다, 그러나 당신의 설정에 따라 많이 다를 수 :

구체적으로는, 실행하여 파이썬에서 사용하는 경로를 찾을 수 있습니다.

파이썬은이 경로 (및 다른 몇 가지 경로)를 사용하여 가져올 패키지를 찾습니다. 따라서 사용자 정의 패키지를 /usr/local/lib/python3.5/site-packages 폴더에 저장하면됩니다. .py 파일을이 폴더에 추가하는 것을 잊지 마십시오.

은 단말기 유형에 다시 구체적으로 :

이제
cd your_path 
cp path_to_custom_package/custom_package ./ 

당신이 패키지가 각 서브 패키지 파일과 같은 디렉토리 (예 : import package.subpackage에 위치한한다면처럼 모든 것을 귀하의 사용자 정의 패키지를 가져올 수 있어야합니다 패키지가 작동해야 함).

+0

몇 가지 질문은 시간을 초월합니다. –

관련 문제