コメントが指摘したように、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ページを非常に慎重に読んで、いくつかのことを試してみる必要があります!
'os.system( 'python python2script.py')'を使用できますか?これは、コマンドラインで引用符で囲まれたコマンドを発行するのと同じです。 –
'exec'は、現在の(Python 3)インタプリタで受け取ったものすべてを自然に実行します。 –
'os。システム 'が機能しない場合は、' __future__'インポートともっとpython3に優しい構文を使うようにpython2スクリプトを書き直すことができます。しかし、exec(open(python2file).read())はこれを行うには非常に厄介な方法です。好ましい方法は 'import python2file'でコードを実行することです。 –