2017-03-08 6 views
0

python3スクリプトからpython2スクリプトを実行できるかどうかを知りたいと思います。exec()python3からのスクリプト

py3で書かれたファイルは、初期ファイル内で処理するための辞書を取得するためにpy2で書かれたレガシーコードを実行する必要があります。上述PY2スクリプトを呼び出すPY3に

線が

exec(open('python2script.py').read()) 

あり、それはバージョン3との第1差分にクラッシュした時点でpython2script.pyを、処理を開始するまで、スクリプトがエラーなしで実行されます。

+2

'os.system( 'python python2script.py')'を使用できますか?これは、コマンドラインで引用符で囲まれたコマンドを発行するのと同じです。 –

+0

'exec'は、現在の(Python 3)インタプリタで受け取ったものすべてを自然に実行します。 –

+1

'os。システム 'が機能しない場合は、' __future__'インポートともっとpython3に優しい構文を使うようにpython2スクリプトを書き直すことができます。しかし、exec(open(python2file).read())はこれを行うには非常に厄介な方法です。好ましい方法は 'import python2file'でコードを実行することです。 –

答えて

-1

私はpython 3スクリプトからpython 2スクリプトを実行することはできないとは思わない。しかし、純粋なPythonの2.xコードから3.xへの変換は、一般的に直接的な機械的な変換です。そのような家事に役立つ2to3というプログラムがあります。

2

コメントが指摘したように、exec()は現在のpython実装を使用しているため、python 3のコードをpython 3のコードから実行することはできません。

あなたはポートそれ、あなたの最善の策はos.systemのいずれかを使用して、サブプロセスとしてそれを呼び出すために、単純でない限り..:

./py3.py

#!/usr/bin/env python3 
import os 

print('running py2') 
os.system('./py2.py') 
print('done') 

./py2.py

#!/usr/bin/env python2.7 
print "hello from python2!" 
その後

(それらを両方実行を行った後)を実行します。

$ ./py3.py 

または代わりに、あなたが戻ってデータを渡すと、あなたのpython3コードでpython2スクリプトからあなたの結果を得ることができるようなjsonとして直列化モジュールを使用して、より簡単に転送することを可能にする、より柔軟なsubprocessを使用することができます。

あなたが必要とするデータを荷造りし、それを上に運ぶことは容易であってもよいことのように

#!/usr/bin/env python3 
import json 
from subprocess import PIPE, Popen 

print('running py2') 
py2_proc = Popen(['./py2.py'], stdout=PIPE) 
# do not care about stderr 
stdout, _ = py2_proc.communicate() 
result = json.loads(stdout.decode()) 
print('value1 was %s, value2 was %s' % (result['value1'], result['value2'])) 

./py2.py

#!/usr/bin/env python2.7 
import json 

my_result = { 
    'value1': 1, 
    'value2': 3 
} 
print json.dumps(my_result) 

を./py3.py。

注:ここでは、私のシステムのpython2.7とpython3を使用して、非常に簡単な環境設定を使用しました。現実の世界では、この種のものを正しく動作させるための最も苦痛なことは、環境を正しく構成することです。たとえば、仮想環境を使用しているとします。おそらくあなたは正しいパスのpython2バージョンを持っていないユーザーとして実行しています。おそらくファイルを実行可能にすることはできないので、サブプロセス/ os.system呼び出しでpythonのパスを指定する必要があります。多くのオプションがあり、それは非常に複雑ですが、質問の範囲外です。あなたは、docページを非常に慎重に読んで、いくつかのことを試してみる必要があります!

+0

@Benjaminとして実行するための' os.system'の使用に関する問題と、あなたの(@daphtdazz)の言及は、 py3スクリプトをpy2の実行に使用すると、py2から保存されたオブジェクトはpy3スクリプトのモジュール内で呼び出されます。エラーの例が返されました。 'TypeError:'モジュール 'オブジェクトはサブスクリプトできません'。 py3スクリプトは、元のpy2スクリプト(新しいモジュールfrm importsとの対話のためにpy3を使用)を修正しました。このプロセスはもともと 'execfile( 'py2script.py')'を使って行われましたが、私が記述したことはすべて許されていました。 –

+0

申し訳ありませんが、少し慎重に読んでください。私は 'json'を使って2つの間でデータを転送する方法を示すために私の答えを更新しました。これは、python2スクリプトをpython3に変換するよりも簡単なことです - 古いexec機構を使って結果を取得し、それをPython 3に送信する小さなラッピングpython2スクリプトを作成することもできますあなたの唯一の本当の選択肢。 – daphtdazz

関連する問題