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