it-swarm.com.ru

При использовании PyInstaller модуль не назван

Я пытаюсь скомпилировать проект Python под Windows 7, используя PyInstaller. Проект работает нормально, проблем нет, однако, когда я пытаюсь его скомпилировать, результат не работает. Хотя я не получаю предупреждений во время компиляции, их много в файле warnmain.txt в каталоге build: 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 не выдает никаких ошибок/предупреждений, я не мог понять, связана ли проблема с библиотеками или есть что-то еще, что следует рассмотреть.

22
a_guest

Проблема заключалась в некоторых зависимостях времени выполнения matplotlib. Таким образом, компиляция прошла нормально, при запуске программы возникли некоторые ошибки. Поскольку терминал сразу закрылся, я этого не понял. После перенаправления stdout и stderr в файл я увидел, что пропустил библиотеки Tkinter и FileDialog. Добавление двух imports вверху главного решило эту проблему.

6
a_guest

Pyinstaller не увидит импорт второго уровня . Поэтому, если вы импортируете модуль A, pyinstaller увидит это. Но любой дополнительный модуль, импортированный в A, не будет виден.

Нет необходимости что-либо менять в ваших скриптах на python. Вы можете напрямую добавить отсутствующий импорт в spec файл . Просто измените следующую строку:

hiddenimports=[],

в

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

Была похожая проблема с no module named FileDialog. Обнаружил, что с версией 3.2 я мог бы использовать 

pyinstaller --hidden-import FileDialog ... 

вместо изменения моего основного сценария.

8
HHest

Если дело в том, что вам не нужен 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
1
ullix

У меня была такая же проблема с pyinstaller 3.0 и weblib. Импорт в основном не помог. 

Помогло обновление до 3.1 и удаление всех файлов сборки.

pip install --upgrade pyinstaller
0
fivef