2015-01-09 2 views
8

두 개의 스크립트가 있습니다. 메인은 파이썬 3에서, 두 번째는 파이썬 2로 작성되었습니다 (파이썬 2 라이브러리를 사용합니다).파이썬 3에서 파이썬 2 스크립트 호출하기

Python 3 스크립트에서 호출하고 싶은 Python 2 스크립트에는 한 가지 방법이 있지만이 브리지를 교차하는 방법을 모르겠습니다.

+0

특정 방법은 파이썬 2 특정 기능에 의존합니까? 파이썬 3으로 변환 될 수 있습니까? – jonrsharpe

+0

파이썬 2 전용 라이브러리 (Obspy, 현재 3.x에서는 지원되지 않음)를 사용하고 있습니다. –

+2

3x에서 지원되지 않으면 간단히 실행할 수 없습니다. –

답변

7

당신은 일을 서브 프로세스 (파이썬 모듈)을 사용하여 bash가 python2를 실행할 수 다음

3 파이썬 에서 :

#!/usr/bin/env python3 
import subprocess 

python3_command = "py2file.py arg1 arg2" # launch your python2 script using bash 

process = subprocess.Popen(python3_command.split(), stdout=subprocess.PIPE) 
output, error = process.communicate() # receive output from the python2 script 

어디 다른 호출

+0

내 문제를 해결 한 훌륭한 답변, 감사합니다! – frakman1

+0

다음 파이썬 라인을 실행하기 전에 서브 프로세스가 끝날 때까지 기다리려면'subprocess.call' 사용을 고려하십시오 https://stackoverflow.com/a/89243/3822261 –

+1

이것이 어떻게 대답인지 이해할 수 없습니다. 파이썬 3 인터프리터를 사용합니다. –

3

을 반환 어떤 파이썬이 출력 저장 서로의 파이썬 버전은 'execnet'을 사용하여 매우 우아하게 처리 할 수 ​​있습니다. 그런 다음

def my_function(X, Y): 
    return "Hello %s %s!" % (X, Y) 

다음과 같은 기능을

result = call_python_version("2.7", "my_module", "my_function", 
          ["Mr", "Bear"]) 
print(result) 
result = call_python_version("2.7", "my_module", "my_function", 
          ["Mrs", "Wolf"]) 
print(result) 

결과

Hello Mr Bear! 
Hello Mrs Wolf! 
를 호출

import execnet 

def call_python_version(Version, Module, Function, ArgumentList): 
    gw  = execnet.makegateway("popen//python=python%s" % Version) 
    channel = gw.remote_exec(""" 
     from %s import %s as the_function 
     channel.send(the_function(*channel.receive())) 
    """ % (Module, Function)) 
    channel.send(ArgumentList) 
    return channel.receive() 

예 : 파이썬 2.7로 작성된 my_module.py 다음 함수는 매력을 수행

무슨 일이 일어 났습니까? channel.receive()과 함께 인수 목록에 대해 을 대기하는 '게이트웨이'가 인스턴스화되었다는 것입니다. 일단 그것이 들어 오면 그것은 번역되어 my_function에게 건네졌습니다. my_function은 생성 된 문자열을 반환하고 channel.send(...)은 문자열을 되돌려 보냈습니다. 게이트웨이의 다른 쪽에서는 channel.receive()이 결과를 포착하여 호출자에게 리턴합니다. 호출자는 결국 my_function에 의해 생성 된 문자열을 파이썬 3 모듈에 인쇄합니다.

+0

텍스트 이외의 다른 개체를 보내고받을 수 있습니까? – jadsq

+0

예, 가능합니다! 그것은 'execnet'에 대한 좋은 점입니다. 호환되는 방식으로 객체를 직렬화합니다. –

+0

@ Frank-ReneSchäfer 플로트와 문자열의 튜플을 반환하는 python2 함수를 호출하여 함수를 실행 해 보았습니다. 'DumpError : '을 직렬화 할 수 없습니다.라는 오류 메시지가 나타납니다. 이 문제를 어떻게 해결할 수 있을지 알기나 해? – IM94

0

python 3으로 파이썬 코드를 실행하고 있지만 python 2.7로 작성된 도구 (ocropus)가 필요합니다. 나는 오랫동안이 모든 옵션을 서브 프로세스로 시험해 보았고 오류가 계속 있었으며 스크립트는 완료되지 않았습니다. 커맨드 라인에서, 그것은 잘 실행됩니다. 그래서 마침내 효과가있는 간단한 것을 시도했지만 온라인 검색에서 찾지 못했습니다. ocropus 명령을 bash 스크립트에 넣습니다.

#!/bin/bash 

/usr/local/bin/ocropus-gpageseg $1 

하위 프로세스로 bash 스크립트를 호출합니다.

command = [ocropus_gpageseg_path, current_path] 
process = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
output, error = process.communicate() 
print('output',output,'error',error) 

이것은 실제로 ocropus 스크립트가 필요로하는 자체 세계를 제공합니다. 나는 누군가 다른 사람을 구할 것이라는 희망으로 이것을 게시하고 있습니다.

+0

셸 명령으로 보안 위험이 발생할 수 있습니다. 그것은 권장되지 않습니다. – user2564259

0

참고 : liclipse IDE에서 Python 2.x/w를 실행할 때 이런 현상이 발생했습니다. 명령 줄에서 bash 스크립트를 실행했을 때 문제가 발생하지 않았습니다. 여기에 파이썬 2.x & 3.x 스크립트를 혼합했을 때 내가 가진 & 솔루션의 문제점이 있습니다.

나는 python 3.6 스크립트를 호출/실행하는 데 필요한 & 파이썬 2.6 프로세스를 실행 중입니다. 환경 변수 PYTHONPATH가 2를 가리 키도록 설정되었습니다.6 파이썬 S/W, 그래서 그것은 followng 질식했다 : 012 파이썬 스크립트가 실패하게되었습니다. 그래서 3.6 프로그램을 직접 호출하는 대신 PYTHONPATH 환경 변수를 nuked하는 bash 스크립트를 만들었습니다.

#!/bin/bash 
export PYTHONPATH= 
## Now call the 3.6 python scrtipt 
./36psrc/rpiapi/RPiAPI.py $1 
관련 문제