PyInstaller - нет модуля с именем
Я пытаюсь скомпилировать проект Python под Windows 7 с помощью PyInstaller. Проект работает нормально, проблем нет, однако, когда я пытаюсь скомпилировать его, результат не работает. Хотя во время компиляции я не вижу предупреждений, в файле warnmain.txt
в каталоге build
есть много: warnmain.txt
Я действительно не понимаю эти предупреждения, например no module named numpy.pi
, так как numpy.pi
не является модулем, а числом. Я никогда не пытался импортировать numpy.pi
. Я явно импортировал numpy
и matplotlib
. Кроме того, я использую PyQt4. Я думал, что ошибка может быть связана с этими библиотеками.
Однако мне удалось скомпилировать простой script, который успешно использует 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, но крючки, где вниз, используя каталог по умолчанию, насколько я мог читать из вывода компиляции, например. hook-matplotlib
выполнено. Я не видел никакого крючка для numpy
и не мог ли я для моего небольшого примера script, но это сработало. Я использовал следующие импорты в своих файлах (не все в одном, но в разных):
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 не дает никаких ошибок/предупреждений, я не мог понять, связана ли проблема с библиотеками или есть что-то еще, что нужно учитывать.
Update
После предложения JoranBeasley я скомпилировал программу без -w
и перенаправил stdout и stderr в файл. При выполнении программы я получил следующий ImportError
s:
no module named Tkinter # seemed to be required by matplotlib
и после добавления import Tkinter
в начале моего основного файла я получил
no module named FileDialog # seemed to be required also by matplotlib
и после того, как я наконец добавил import FileDialog
, программа действительно работает!
Ответы
Ответ 1
Проблема заключалась в некоторых зависимостях времени выполнения matplotlib. Таким образом, компиляция была прекрасной, когда программа запускала некоторые ошибки. Потому что терминал сразу закрылся, я этого не осознавал. После перенаправления stdout
и stderr
в файл я увидел, что я пропустил библиотеки Tkinter
и FileDialog
. Добавление двух import
в верхней части основного раздела решило эту проблему.
Ответ 2
Была аналогичная проблема с no module named FileDialog
. Обнаружено, что с версией 3.2 я мог бы использовать
pyinstaller --hidden-import FileDialog ...
вместо изменения моего основного script.
Ответ 3
Pyinstaller не увидит импорт второго уровня. Поэтому, если вы импортируете модуль A, pyinstaller видит это. Но любой дополнительный модуль, импортированный в A, не будет виден.
Нет необходимости изменять что-либо в ваших сценариях python. Вы можете напрямую добавить недостающий импорт в файл spec.
Просто измените следующую строку:
hiddenimports=[],
к
hiddenimports=["Tkinter", "FileDialog"],
Ответ 4
Если дело в том, что вам не нужны Tkinter и друзья, потому что вы используете PyQt4, тогда лучше всего вообще не загружать 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
Ответ 5
У меня была такая же проблема с pyinstaller 3.0 и weblib
. Импортировать его в основном не помогло.
Помогло обновление до 3.1 и удаление всех файлов сборки.
pip install --upgrade pyinstaller