2017-03-08 473 views
0

我想知道是否有可能從python3腳本執行python2腳本。從python3執行()python2腳本

我有一個使用py3編寫的文件,必須執行用py2編寫的遺留代碼才能獲得在初始文件中處理的字典。

在PY3行調用提到PY2腳本是

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

腳本沒有錯誤,直到它開始處理python2script.py,在該點它崩潰在與版本3的第一差值運行。

+2

你可以使用'os.system('python python2script.py')'?這相當於在命令行中發出引號中的命令。 –

+0

'exec'將自然執行它在當前(python 3)解釋器中收到的所有內容。 –

+1

如果'os。系統「不起作用,那麼你可以看看重寫python2腳本來使用'__future__'導入和更多python3友好的語法。但是,exec(open(python2file).read())是一種非常笨重的方法。首選的方法是「導入python2file」並運行其代碼。 –

回答

-1

我不相信從python 3腳本執行python 2腳本是不可能的。但是,將純Python的2.x代碼轉換爲3.x通常是一種直接的機械翻譯。有一個叫做2to3的程序來幫助你完成那些雜事。

2

正如評論指出的那樣,exec()使用當前的python實現,所以你不能從python 3使用它來執行python 2代碼。

除非你將它移植,最好的辦法是簡單地稱呼其爲一個子進程,即使用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 

或者您可以使用更靈活subprocess,它允許你將數據傳回並轉發更容易使用串行化模塊,例如json,這樣你可以在你的python3代碼從python2腳本結果:

./py3.py

#!/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) 

一樣,它可以很容易收拾你需要的數據和運輸過來。

注意:我已經使用我的系統的python2.7和python3在這裏使用了一個非常簡單的環境設置。在現實世界中,讓這類事情正常工作最痛苦的事情是正確配置環境。也許,例如,您正在使用虛擬環境。也許你正在運行一個用戶,他們的路徑中沒有正確的python2版本。也許你不能使這些文件成爲可執行文件,因此必須在你的子進程/ os.system調用中指定python的路徑。有很多選擇,它非常複雜,但超出了問題的範圍。你只需要仔細閱讀文檔頁面,並嘗試一些事情!

+0

使用'os.system'執行@Benjamin和你(@daphtdazz)提到的問題是來自py3腳本用於執行py2,然後從py2保存的對象在py3腳本的模塊中調用。返回的一個示例錯誤聲明'TypeError:'模塊'對象不是可下載的'。 py3腳本被修改爲原始py2腳本(使用py3與新模塊frm導入進行交互)。這個過程最初是通過'execfile('py2script.py')'完成的,我所描述的全部都是允許的。 –

+0

對不起,我應該仔細閱讀一下。我已經更新了我的答案,以展示如何使用'json'在兩者之間傳輸數據。您可能會發現這比將python2腳本轉換爲python3更容易 - 您甚至可以編寫一個小的包裝python2腳本,它使用舊的exec機制來獲取結果,然後將其發送到python 3 - 但我認爲這些腳本是你唯一真正的選擇。 – daphtdazz