2017-11-18 87 views
2

我正在尋找一種方法來在相同的程序中結合python 3.x和python 2.x模塊。運行使用python 3和python 2.7模塊的Python程序?

目前,我們想使用YAPSI加載它們,但我猜這是一個失敗的原因。

**顯然,它依賴於lib的模塊目前還沒有轉換爲python 3,並且需要很長時間才能完成。

+1

你爲什麼要那麼做。任何特定用例? –

+0

主要是由於依賴於大​​量的第三方庫其中一些是巨蟒-3和其他人蟒2.這就是爲什麼它的問題簡單地轉換使用2to3的工具或其他模塊。 – YafimK

回答

0

你可以但它是很多的工作。這些問題大多是打印語句中的語法錯誤。 簡單的打印將適用於任何版本。

print(" Supports all versions of Python!") 

但是,如果你使用打印任何更高級的功能,這是不可避免的,你要麼結束了一個語法錯誤或不打印你的原意。 Python 2中的尾隨逗號有在Python 3成爲一個參數,因此,如果您使用尾隨逗號,以避免打印後換行,這將在Python 3的樣子

print('Text to print', end=' ') 

這是Python的2

下一個語法錯誤

在Python 2.6中有一個

__future__ import 

進行打印到一個函數。所以爲了避免任何語法錯誤和其他差異,你應該在你使用print()的地方啓動任何文件,從 future import print_function。 未來導入只適用於Python 2.6及更高版本,因此對於Python 2.5及更早版本,您有兩種選擇。您可以將更復雜的打印轉換爲更簡單的打印,也可以使用可在Python 2和Python 3下使用的單獨打印功能。 要解決打印問題,您可以編寫自己的打印功能,這樣可以更輕鬆。

2)導入錯誤。 他們失敗的原因是標準庫讓周圍的重組是很容易像

try: 
    import configparser 
except ImportError: 
    import ConfigParser as configparser 

這將僅適用於重命名的進口工作,對於新模塊或誰是兼併或幾個老的模塊子模塊,你必須將它們轉換2to3這很容易。

3)整數不兼容。

在Python 3中,第一個是int和long類型已合併,這意味着您不能通過添加L後綴來指定整數應該很長。 1L是在Python 3 一個語法錯誤,你能避免像

import sys 
if sys.version_info > (3,): 
    long = int 
long(1) 
1L 

另一個變化是,八進制文字語法也發生了變化。至 。避免你可以使用十進制或十六進制值,並將八進制值放在註釋中,如

f = 420 # 644 in octal, 'rw-r--r--' 

4)處理二進制數據。 其中最棘手和最複雜的都是。你可以閱讀它的文檔here

0

from @Frrank answer;我強烈建議你自己將模塊源代碼轉換爲python 3x!或許多工具,你可以通過在谷歌搜索找到...

但一般來說,我認爲有此問題沒有Python的方式。但是你可以;用棘手的方式! (有三個棘手的方式):

第一:

  1. 同時下載蟒蛇2倍和3倍便攜口譯

  2. 複製並粘貼到同一個文件夾

  3. 與原來的 口譯分開來寫程序的每個部分(寫程序的功能或對象orinted)

  4. 做一個主程序與python3x和調用這些兩個部分 子,高管或其他方法

  5. 現在可以將這個文件夾編譯成一個EXE文件或進行設置( 包exe文件)並完成!

二:

如果你是cython友善,你可以將每個部分轉換您 程序,C/C++,那麼你可以合併或re_convert他們到Python 碼!

三:

如果你是jython友善,你可以將每個部分將您 程序到Java(jar文件),那麼你可以合併或re_convert他們到Python 碼!

好運...