2011-04-27 69 views
2

我使用py2exe捆綁python源代碼。目錄結構如下:py2exe無法從其他目錄導入模塊

some_Mod.py 
some_dir/another_dir/some_Mod.py 

裏面後者some_dir/another_dir/some_Mod.py我試圖用

from ..some_Mod import * 

使用進口導入其他Python模塊會與蟒蛇沒有問題口譯員,但如果我在捆綁包中運行相同的星座,我會得到一個例外:

ImportError: No module named some_Mod 

有人可以解釋爲什麼嗎?

備註:重命名模塊實際上沒有問題,但我只是想知道,爲什麼py2exe不能處理這個星座。

回答

4

解釋的。如果你在每個__init__.py文件那些子目錄,那麼所有的導入語句應該正常工作。
假設這是沒有問題的,這裏是一個很好的指南,導入最佳做法:

http://blog.habnab.it/blog/2013/07/21/python-packages-and-you/

總之,千萬不要用相對導入 - 總是絕對的(見上爲什麼鏈接)。

其次(我不完全確定爲什麼),請始終將您的py2exe setup.py腳本保存在主腳本所在的確切文件夾中。我已經嘗試修改py2exe的'腳本'選項,以允許我的腳本在別的地方......但是確切的問題發生在我身上。所以,請確保它正確的位置在主要腳本的位置。

最後,你總是可以給py2exe一點幫助。我通常必須將根目錄添加到系統路徑,以便導入語句有效。請注意,我不會修改sys.path任何我的應用程序的代碼 - 只有py2exe腳本我用來構建exe。

在我的py2exe安裝腳本的頂部:雖然

import sys 
sys.path.append(PATH_WHERE_PACKAGES_ARE) 
# add any packages that need explicit importing here located in root directory: 
import package1 # apparently it wasn't found... 
import package2 # apparently same thing 

一般來說,我不導入包,增加項目的根在那裏他們通常存在就足夠了。

+0

儘管「謝謝」不鼓勵......我一直在與這種場景打交道幾年,現在已經提供了一個可行的解決方案。所以謝謝! – S3DEV 2017-12-11 13:27:52

0

我不知道現在py2exe如何處理from ..some_Mod import *語法,請在此以確保some_Mod.py模塊是否正確打包:python -m py2exe.mf -d some_dir/another_dir/some_Mod.py作爲py2exe FAQ

+0

根據http://www.py2exe.org/index.cgi/News py2exe應導入相對導入。 – Bertolt 2011-04-27 13:25:54

+0

好吧,是生成的library.zip中存在的模塊some_Mod.py? – 2011-04-27 13:38:10

+0

兩個模塊都存在。我打開了由py2exe創建的library.zip,它包含相同的目錄結構。 – Bertolt 2011-04-27 13:48:45