2016-06-13 4 views
2

많은 다른 주제의 웹에서 많은 연구를 한 후 필자의 문제에 답하는 해결책을 찾지 못했습니다.Python 외부 프로젝트 스크립트 실행

다른 프로젝트의 파이썬 스크립트를 처리 할 수있는 도구 (그래픽 인터페이스 포함)를 개발 중입니다. 의존성에 대한 문제가 없으므로 사용자에게 프로젝트 디렉토리와 처리 할 스크립트를 지정하도록 요청합니다.

이 도구를 개발하기 위해 IDE에서 프로젝트 "benchmark_tool"을 GUI에 통합하고 프로젝트 "test_project"를 사용하여 다양한 테스트 스크립트를 그룹화했습니다. 분명히 최종 목표는 컴파일 할 도구이므로 "benchmark_tool"프로젝트가 IDE에서 사라집니다.

benchmark_tool (python project) 
    __init__.py 
    main.py 

test_project (python project) 
    __init__.py 
    module1 
     __init__.py 
     test_script.py 
    module2 
     __init__.py 
     imports.py 

그것이 작동하는 방법 : :이 main.py는 test_script.py이라 하리라 여기

는 IDE 아키텍처입니다. test_script.py는 스크립트를 처음 만들 때 imports.py를 호출합니다.

UPDATE

나는 내 주요 코드에서 일부 수정을 시도 :이 오류가 발생했습니다

import sys 
import subprocess 

subprocess.check_call([sys.executable, '-m', 'test_project.module1.test_script'], cwd='D:/project/python') 

Traceback(most recent call last): 
    File "C:/Python31/lib/runpy.py", line 110, in run module as main 
     mod_name, loader, code, fname = _get_module_detail(mod_name) 
    File "C:/Python31/lib/runpy.py", line 91, in get module details 
     code = loader.get_code(mod_name) 
    File "C:/Python31/lib/pkgutil.py", line 272, in get code 
     self.code = compile(source, self.filename, 'exec') 
    File "D:/project/python/test_project/module1/test_script.py", line 474 


SyntaxError: invalid syntax 
Traceback (most recent call last): 
    File "D:/other_project/benchmark_tool/main.py", line 187, in read 
     subprocess.check_call([sys.executable, '-m', 'module1.test_script.py'], cwd='D:/project/python/test_project') 
    File "C:/Python31/lib/subprocess.py", line 446, in check call 
     raise CalledProcessError(retcode, cmd) 
subprocess.CalledProcessError: Command '['C:/Python31/python.exe', '-m', 'module1.test_script.py']' returned non-zero exit status 1 

subprocess.Popen(['python','D:/project/python/test_project/module1/test_script.py])

와 함께 작동

두 방법의 주요 차이점은 무엇입니까? test_scripts.py에 인수를 전달해야합니다. python 스크립트 (입력 및 출력 데이터가 교환 됨)와 통신하는 데 가장 적합한 인수는 무엇입니까? 사전

+0

가 : 당신이 module1.test_script'와'모듈 1/test_script'이해 마십시오 .py'는 다른 문자열입니까? 'PYTHONPATH'을 수정하지 마십시오. 내 대답에서 pythonpath를 어디에서 수정하는지 어디서 알 수 있습니까? 내 대답을주의 깊게 읽으십시오 - 다른 코드를 추가하지 마십시오. 명확하게하기 위해 질문을 업데이트하고 module1과 module2가 최상위 Python 모듈인지 또는'test_project'의 하위 모듈인지 (즉,'test_project'가 Python 모듈인지 또는 단지 디렉토리인지)를 지정하십시오. 대답에 따라, 두 경우를 다루는 내 대답의 해당 코드 예제를 사용하십시오. – jfs

+0

죄송합니다. 저는'module1.test_script'를 넣었지만 제대로 작성하지 않았습니다. (필자가 작성해야하는 코드를 복사/붙여 넣기 할 수 없습니다). test_project는 디렉토리가 아닌 파이썬 모듈이며, module1과 module2는 test_script의 서브 모듈입니다. 'PYTHONPATH' 명령을 제거했지만 같은 오류가 발생했습니다. –

+0

왜 작성해야합니까? 명령 줄에서 복사하여 붙여 넣는 방법을 모르는 경우 특정 환경에 대한 별도의 질문을하십시오 (유용합니다). 정확한 명령을주지 않으면 내가 도울 수 없습니다. 다시 말하지만,''module1.test_script.py ''는 'module1.test_script'와 다릅니다. 'test_project'가 파이썬 모듈이라면, 제 대답의 두 번째 변형을 사용하십시오. 즉,'subprocess.check_call ([sys.executable, '-m', 'test_project.module1.test_script'], cwd = r'D : \ project \ 파이썬 ')'. 관련 없음 : Windows 경로에 원시 문자열 리터럴을 사용할 수 있습니다 ('r'접두사 사용). – jfs

답변

0

에 의해

덕분에 설치, "외부 프로젝트 스크립트"를 실행하려면 예 : pip install project (당신이 원하는 경우 VIRTUALENV에서 실행) 후 다른 실행 파일에 당신처럼 스크립트를 실행합니다 :

#!/usr/bin/env python 
import subprocess 

subprocess.check_call(['executable', 'arg 1', '2']) 

다음 (module1/__init__.py 파일이 가정) 서브 프로세스로 주어진 경로에서 스크립트를 실행하는 프로젝트를 설치하지 않고는 종속성이 없습니다 (또는 당신이 이미 설치되어있는 가정) 경우 :

#!/usr/bin/env python 
import subprocess 
import sys 

subprocess.check_call([sys.executable, '-m', 'module1.test_script'], 
         cwd='/abs/path/to/test_project') 

-m을 사용하여 스크립트를 실행하면 many import issues은 피해야합니다.

위의 내용은 test_project이 Python 패키지 (아니 test_project/__init__.py)가 아니라고 가정합니다. test_project 자체 인 경우 파이썬 패키지는 모듈 이름에 포함하는 대신 상위 디렉토리에서 시작 : 당신은 명령 줄 매개 변수 (sys.argv)로 test_project 디렉토리의 경로를 통과 할 수

subprocess.check_call([sys.executable, '-m', 'test_project.module1.test_script'], 
         cwd='/abs/path/to') 

또는에서 읽기 설정 파일 (configparser, json).상위 스크립트의 설치 경로를 기준으로 계산하지 마십시오 (pkgutil, setuptools 'pkg_resources을 사용하여 데이터를 가져와야하는 경우). 사용자 데이터를 저장할 장소를 찾으려면 appdirs Python package을 사용할 수 있습니다.

+0

왜 프로젝트를 설치해야합니까? –

+0

@v_lfr 프로젝트 종속성이 컴퓨터에 어떻게 나타날 것으로 예상합니까? – jfs

+0

실제로 2 개의 프로젝트가 있습니다. 하나는 컴파일 된 도구가 될 것입니다.이 도구는 테스트 스크립트가있는 다른 파이썬 프로젝트 링크를 실행하도록 사용자에게 요청합니다. 그래서 저는 이미 사용자 컴퓨터에있을 많은 파이썬 프로젝트로 컴파일 된 프로젝트를 1 개 만들 계획입니다. 해당 프로젝트 종속성은 사용자가 프로젝트 링크를 넣을 때'PYTHONPATH'에 자동으로 추가됩니다. 희망이 있습니다 .... @ J.F.Sebastian –

0

난 당신이 해결해야한다는 3 참조 문제가 있습니다

  1. 모듈 2에서 가져 오려면, 당신은 그것에서
  2. 때를 빈 *__init__.py 파일을 배치하여 패키지에 디렉토리를 설정해야합니다 test_script.py을 실행하면 파일 이름뿐 아니라 파일의 전체 경로가 필요합니다.
  3. 스크립트에 대한 sys.path 수정. 당신이 test_script.py에 그 내용을 전파하려는 경우,

따라서 PYTHONPATH 환경 변수를 설정, 내 솔루션은 다음과 같습니다

당신의 업데이트에 대한
import os 
import sys 
import subprocess 

# Here is one way to determine test_project 
# You might want to do it differently 
script_dir = os.path.abspath(os.path.dirname(__file__)) 
test_project = os.path.normpath(os.path.join(script_dir, '..', 'test_project')) 

python_path = '{}:{}'.format(os.environ.get('PYTHONPATH', ''), test_project) 
python_path = python_path.lstrip(':') # In case PYTHONPATH was not set 

# Need to determine the full path to the script 
script = os.path.join(test_project, 'module1', 'test_script.py') 
proc = subprocess.Popen(['python', script], env=dict(PYTHONPATH=python_path)) 
+0

1. 나는 그것을 언급하지는 않았지만 실제로 이미 내 module2에 init.py가 있습니다. 2. 나는 또한 전체 경로를 넣으려고했지만 어쨌든 작동하지 않았다. 3. 나는 맞다. PYTHONPATH 환경 변수를 설정하는 것은'sys.path.append (test_project)'와 같다? 나는 당신의 솔루션을 시도했지만 작동하지 않았고 여전히 동일한 오류가 있습니다. @HaiVu –

+0

# 2는 작동하지 않았습니까? ** 의미있는 스크립트를 찾을 수 없거나 임포트 할 수 없습니까? # 3에서'sys.path.append (...)'는 PYTHONPATH를 설정하는 것과 같지 않습니다. 필자는 스크립트에서 테스트하고 확인했습니다. –

+0

적어도 두 가지 문제가 있습니다 : 1 - 어떻게'test_project' 의존성을 설치합니까? 2 - Python 패키지 내부에서 * 직접 스크립트를 실행합니다 (그렇게하면 안됩니다). 개인이 PYTHONPATH를 구성 할 수없는 경우 [가져 오기 문제] (https://www.python.org/dev/peps/pep-0395/#traps-for-the-unwary)를 해결하기가 어려울 수 있습니다. 그 역시 발생합니다. 관련 없음 :'os.pathsep'와''get_script_dir()'] (http://stackoverflow.com/a/22881871/4279)를 사용할 수 있습니다. (설치 디렉토리와 관련된 파일에 대한 낚시는 멋지게 보이지 않습니다. ,'appdirs'는 더 적절한 경로를 제공 할 수 있습니다). – jfs