2011-09-15 64 views
13

PyInstallerでPythonスクリプトをビルドしようとしています。私は、設定specファイルを生成し、構築するために、次のコマンドを使用していますPyInstaller、specファイル、ImportError: 'blah'という名前のモジュールがありません

# -*- 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/、ディレクトリ内の実行可能ファイルを構築しました:ここ

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

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

は、それが生成されたスペックファイルです。このファイルを実行しようとすると、私は次を得る:

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文で書いた、ウェブサイトs。

+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には、の第2レベルのインポートが表示されません。したがって、モジュールをインポートすると、pyinstallerはこれを認識します。しかし、にインポートされた追加のモジュールは表示されません。

Pythonスクリプトで何も変更する必要はありません。不足しているインポートを直接仕様ファイルに追加することができます。 ただa = Analysis(...)に次の行を追加します。

hiddenimports=["mysql"], 

これは結果でなければなりません:引数としてspecファイルとその実行pyInstallerの後

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"],) 

+0

thanx +1!注意:後でpyinstallerを実行するときは、.pyファイルではなく.specファイルを引数として指定してください! (詳細は質問を読む、初めてではなかった...;)) – ntg

0

はちょうど私が今日、同じ問題が発生したため、私の2セントを追加するつもり - 6年後:Windowsの場合D

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コマンドウィンドウがポップアップしないようにするためです。

関連する問題