web-dev-qa-db-ja.com

PyInstallerを使用するときにモジュールが指定されていません

PyInstallerを使用してWindows 7でPythonプロジェクトをコンパイルしようとしました。プロジェクトは正常に動作し、問題はありませんが、コンパイルしようとすると結果は動作しません。コンパイル中の警告は、buildディレクトリのwarnmain.txtファイルに多くあります。 warnmain.txt

numpy.piはモジュールではなく番号であるため、「numpy.piという名前のモジュールはありません」など、これらの警告は実際には理解できません。 numpy.piをインポートしようとしませんでした。 numpymatplotlibを明示的にインポートしました。さらに、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はエラー/警告を出さないので、問題がライブラリに関連するものなのか、他に考慮すべきものがあるのか​​を判断できませんでした。

25
a_guest

問題は、matplotlibのいくつかのランタイム依存関係でした。そのため、プログラムの実行中にコンパイルが正常に行われ、いくつかのエラーがスローされました。端末がすぐに閉じたので、私はそれを知りませんでした。 stdoutstderrをファイルにリダイレクトした後、ライブラリTkinterFileDialogが見つからなかったことがわかりました。メインの上部に2つのimportsを追加すると、この問題が解決しました。

7
a_guest

no module named FileDialogでも同様の問題がありました。バージョン3.2では、私は

pyinstaller --hidden-import FileDialog ...

メインスクリプトを変更する代わりに。

15
HHest

Pyinstallerはsecond level importsを見ません。したがって、モジュール[〜#〜] a [〜#〜]をインポートすると、pyinstallerはこれを認識します。ただし、[〜#〜] a [〜#〜]にインポートされた追加モジュールは表示されません。

pythonスクリプト。何も変更する必要はありません。欠落しているインポートをspecファイルに直接追加できます。次の行を変更するだけです。

hiddenimports=[],

hiddenimports=["Tkinter", "FileDialog"],
10
user1251007

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
1
ullix

Pyinstaller 3.0とweblibでも同じ問題が発生しました。メインにインポートしても役に立ちませんでした。

3.1へのアップグレードとすべてのビルドファイルの削除が役立ちました。

pip install --upgrade pyinstaller
0
fivef