2011-09-15 61 views
13

我試圖通過PyInstaller建立一個python腳本。我用下面的命令來配置,生成一個規範的文件,並建立:PyInstaller,規範文件,導入錯誤:沒有模塊名爲「嗒嗒」

wget pyinstaller.zip, extracted it, python Configure.py, etc, then: 

python pyinstaller/Makespec.py --onefile myscript.py 
python pyinstaller/Build.py myscript.spec 

這裏是它產生的spec文件:

# -*- mode: python -*- 
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'], 
      pathex=['/home/user/projects/icinga_python/releases/v2.1']) 
pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name=os.path.join('dist', 'myscript'), 
      debug=False, 
      strip=False, 
      upx=True, 
      console=1) 

dist/目錄生成一個可執行文件。當試圖運行這個文件,我得到如下:

Traceback (most recent call last): 
    File "<string>", line 12, in <module> 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook 
    raise ImportError, "No module named %s" % fqname 
ImportError: No module named mysql 

如果我搬到這個可執行文件到實際的Python代碼的目錄,它給了不同的結果:

Traceback (most recent call last): 
    File "<string>", line 12, in <module> 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 436, in importHook 
    mod = _self_doimport(nm, ctx, fqname) 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 521, in doimport 
    exec co in mod.__dict__ 
    File "CLUSTER/mysql/icingasql.py", line 13, in <module> 
    import urllib2 
    File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook 
    raise ImportError, "No module named %s" % fqname 
ImportError: No module named urllib2 

在... pyinstaller docs我看到--onefile是我需要/想要的選項,但由於某種原因不能代表一切正在被編譯。

劇本是不是真的包括任何幻想,只是有點快的模塊,我寫SQL語句,並解析某些網站秒。

+0

我應該嘗試將所有庫放在路徑上,或最終放在PYTHONPATH上,並停止移動庫。 – Louis

+0

對不起,做什麼?是在spec文件中? – Cmag

+0

http://docs.python.org/tutorial/modules.html – Louis

回答

3

當您的代碼中有動態導入時,此錯誤可能會發生。在這種情況下,pyinstaller不會在exe文件中包含這些包。在這種情況下,您可以:

  1. 添加這些軟件包未使用的導入在你的代碼
  2. Tell pyinstaller to include it

一個文件選項不改變運行代碼什麼。如果你是創建--onefile exe文件,pyinstaller創建的所有文件都打包成exe文件,並且每次運行exe時都將其解壓到本地temp。

3

的問題是,pyinstaller不會看到第二級進口。所以如果你導入模塊A,pyinstaller會看到這個。但不會看到在A中導入的任何其他模塊。

沒有必要在你的Python腳本進行任何更改。您可以直接將缺少的進口添加到規格文件。 只需添加以下的a = Analysis(...)

hiddenimports=["mysql"], 

這應該是結果:

a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'], 
     pathex=['/home/user/projects/icinga_python/releases/v2.1'], hiddenimports=["mysql"],) 

與規範文件作爲一個參數,運行pyinstaller之後。

+0

thanx +1!注意:之後運行pyinstaller時,請提供.spec文件的參數,而不是.py文件! (閱讀問題的細節,我沒有第一次......;)) – ntg

0

只是要加我的2美分,因爲我今天遇到同樣的問題 - 第6年以後:d

對於Windows:

1) cmd => rightclick => with admin rights 
2) Enter in cmd: "pip install pyinstaller" 
3) navigate in cmd to the folder of "yourMain.py" 
4) Enter in cmd: "pyinstaller --onefile --windowed yourMain.py" 

5) If you import other scripts/data in "yourMain.py": 
Manually enter the folder "dist" (gets created - where "yourMain.exe" should be by now), 
and copy your scripts or folder structure there 

(e.g. /assets/sounds; /assets/graphics; /scripts; anotherscript.py) 

然後我可以通過雙擊來運行exe文件。

原來很簡單。我的訣竅是「--onfile」,並將其他文件添加到「dist」文件夾中。

「--windowed」就是這樣,當你啓動exe時python命令窗口不會彈出。

相關問題