2017-05-01 56 views
0

下面的代碼是線性方程求解器的一部分。它是爲Python 3編寫的。在運行該程序之前,它將檢查imp.get_magic()的幻數與期望值之間的差異。Python 3.5.0提供了一個意想不到的幻數

我在運行Fedora 25的系統上安裝了Python 3.5.0。 問題是,在我的系統上,我得到了一個不同的魔數值。

所預期的那樣:b'\xf8\x0c\r\n'

相反,我得到:b'\x16\r\r\n'

下面是代碼

def _get_module(): 
    del globals()['_get_module'] 
    import imp 
    import base64 
    import marshal 

    magic = imp.get_magic() 
    if magic == b'\xf8\x0c\r\n': # Python 3.5 
     pycData = <certain value> 
    pycData = base64.decodebytes(pycData) 

因爲我得到了一個神奇的數字不同的值,我不能運行這個程序。

此代碼是從書Coding the Matrix的資源。它可以在「矩陣」一節下找到,文件名爲solver.py(直接下載文件)。

有沒有辦法讓這個滾動?

+0

嗯,難道你不能讓條件變成真嗎?無論如何,這個代碼假設要做什麼? – user1685095

+1

噢,男孩,所以腳本包含嵌入的字節碼,以鍵入Python版本的幻數,並加載該字節碼。什麼可能會出錯? –

+0

@MartijnPieters它與操作系統有關嗎? – dpk

回答

2

每次字節碼更改時都會更新幻數,以確保您不會嘗試將向後不兼容的字節碼裝入舊解釋器。

具體的魔術標記的代碼尋找的是一個爲Python 3.5a0,看到changelog for markers

>>> int.from_bytes(b'\xf8\x0c', 'little') 
3320 

,而你試圖用3.5b2或更高版本加載此(不過3.5.2之前) :

>>> int.from_bytes(b'\x16\r', 'little') 
3350 

您可以將該版本加載到3.5.2;只需禁用魔術標記測試或重寫代碼來提取標記(就像我上面所做的,前兩個字節)並匹配最大可能值。

但我不確定爲什麼那個代碼不是僅僅在第一個地方分發.pyc文件。 Python 3.3字節碼在Python 3.6中加載得很好。 我已經加載了所有版本到Python 3.6,每個運行dis.dis(),發現在字節碼沒有真正的差異。

+0

我使用fedora 25,它附帶python 3.5.2,我沒有卸載它(3.5.2),因爲這個問題的答案,http://stackoverflow.com/questions/13661487/uninstall-old-版本-python-fedora,警告它可能會破壞系統。所以我在現有版本上安裝了3.5.0,IDLE shell和python終端顯示版本爲3.5.0。 所以你對3.5.2版本是正確的,那就是我的系統。 – dpk

+0

較舊的字節碼版本加載*就好了*。他們不會破壞你的系統。 –

+0

另一篇文章警告用Python 3替換系統Python 2,這確實是一個問題,但這很容易通過安裝兩者來避免。這些問題不適用於此。 –

相關問題