PyInstallerを使用してWindows 7でPythonプロジェクトをコンパイルしようとしました。プロジェクトは正常に動作し、問題はありませんが、コンパイルしようとすると結果は動作しません。コンパイル中の警告は、build
ディレクトリのwarnmain.txt
ファイルに多くあります。 warnmain.txt
numpy.pi
はモジュールではなく番号であるため、「numpy.piという名前のモジュールはありません」など、これらの警告は実際には理解できません。 numpy.pi
をインポートしようとしませんでした。 numpy
とmatplotlib
を明示的にインポートしました。さらに、PyQt4を使用しています。エラーはそれらのライブラリに関連している可能性があると思いました。
ただし、numpyを使用する簡単なスクリプトをコンパイルすることはできました。
import sys
from PyQt4 import QtGui, QtCore
import numpy as np
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.pb = QtGui.QPushButton(str(np.pi), self)
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
ここで成功すると、作成された実行可能ファイルが実際に目的の出力を示したことを意味します。ただし、以前とまったく同じ「警告」を含むwarnmain.txt
ファイルも作成されます。だから、実際のプロジェクトをコンパイルしても何の成功ももたらさないという事実は、それらの警告に関連するものではありません(少なくともそれだけではありません)。しかし、エラーは他に何でしょうか?コンパイル中の唯一の出力は「INFO」であり、いずれも否定的なステートメントではありません。
追加のフックディレクトリは指定しませんでしたが、コンパイル出力から読み取ることができる限り、デフォルトディレクトリを使用してフックを指定しました。 hook-matplotlib
が実行されました。私はnumpy
のフックを見ることができませんでした。また、私の小さなスクリプト例では見られませんでしたが、これは機能しました。私は自分のファイルで次のインポートを使用しました(すべて同じではなく、異なるファイルで):
import numpy as np
import matplotlib.pyplot as ppl
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from PyQt4 import QtGui, QtCore
import json
import sys
import numpy # added this one later
import matplotlib # added this one later
PyInstallerはエラー/警告を出さないので、問題がライブラリに関連するものなのか、他に考慮すべきものがあるのかを判断できませんでした。
問題は、matplotlibのいくつかのランタイム依存関係でした。そのため、プログラムの実行中にコンパイルが正常に行われ、いくつかのエラーがスローされました。端末がすぐに閉じたので、私はそれを知りませんでした。 stdout
とstderr
をファイルにリダイレクトした後、ライブラリTkinter
とFileDialog
が見つからなかったことがわかりました。メインの上部に2つのimport
sを追加すると、この問題が解決しました。
no module named FileDialog
でも同様の問題がありました。バージョン3.2では、私は
pyinstaller --hidden-import FileDialog ...
メインスクリプトを変更する代わりに。
Pyinstallerはsecond level importsを見ません。したがって、モジュール[〜#〜] a [〜#〜]をインポートすると、pyinstallerはこれを認識します。ただし、[〜#〜] a [〜#〜]にインポートされた追加モジュールは表示されません。
pythonスクリプト。何も変更する必要はありません。欠落しているインポートをspecファイルに直接追加できます。次の行を変更するだけです。
hiddenimports=[],
に
hiddenimports=["Tkinter", "FileDialog"],
PyQt4を使用しているためにTkinterや友人が不要な場合は、Tkinterなどを完全にロードしないようにするのが最善かもしれません。/etc/matplotlibrcを調べて、デフォルトをPyQt4に変更します。以下の「変更された」行を参照してください。
#### CONFIGURATION BEGINS HERE
# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# 'module://my_backend'.
#modified
#backend : TkAgg
backend : Qt4Agg
# If you are using the Qt4Agg backend, you can choose here
# to use the PyQt4 bindings or the newer PySide bindings to
# the underlying Qt4 toolkit.
#modified
#backend.qt4 : PyQt4 # PyQt4 | PySide
backend.qt4 : PyQt4 # PyQt4 | PySide
Pyinstaller 3.0とweblib
でも同じ問題が発生しました。メインにインポートしても役に立ちませんでした。
3.1へのアップグレードとすべてのビルドファイルの削除が役立ちました。
pip install --upgrade pyinstaller