PyInstaller, но с сохранением возможности обновления файлов .py

Мне удалось упаковать свое приложение PyQt4 как «автономное» приложение для Windows, оно работает.

Однако это приложение может обновляться, что делается путем замены фактического кода, написанного мной (файлы .py), новыми версиями, загруженными через Интернет.

Как я могу сказать, что PyInstaller выполняет свою работу (собирает библиотеки DLL, создает панель запуска с блестящим значком и т. д.), НО оставляет файлы .py нетронутыми?

Мне нужны эти файлы прямо на диске, чтобы работало автообновление.


person Flavius    schedule 20.03.2011    source источник


Ответы (4)


Вы можете изменить файл спецификации, чтобы он специально не включал файлы по имени (при создании списков), а затем убедитесь, что эти файлы включены - мне нужно проверить, есть ли возможность включать, но не компилировать.


Я не пробовал это сам (я использую pyInstaller на работе, но не устанавливаю его на своем домашнем ПК), но я думаю, что это то, что должно быть в порядке:

a = Analysis(['main.py'])
excluded = ['myfile0.py', 'myfile1.py', 'myfile2.py']
a.scripts = [script from script in a.scripts if script not in excluded]
pyz = PYZ(a.pure)
exe = EXE(a.scripts, pyz, name="main.exe", exclude_binaries=1)
dist = COLLECT(exe, a.binaries, excluded, name="dist")
person theheadofabroom    schedule 20.03.2011
comment
@Flavius ​​Я привел пример в редактировании моего ответа, хотя, подумав об этом, вы можете использовать файлы py[co] в зависимости от того, на кого вы развертываете, действительно ли вы хотите, чтобы они видели ваш источник, и как большое значение имеет производительность. - person theheadofabroom; 20.03.2011

На самом деле это больше похоже на это:

a = Analysis(['main.py'])
excluded = ['pathto\\myfile0.py', 'pathto\\myfile1.py', 'pathto\\myfile2.py']
a.scripts = [script from script in a.scripts if script[1] not in excluded]
pyz = PYZ(a.pure)
excluded_files_collect = [(f.split('\\')[-1],f,'DATA') for f in excluded]
exe = EXE(a.scripts, pyz, name="main.exe", exclude_binaries=1)
dist = COLLECT(exe, a.binaries, excluded_files_collect , name="dist")

Поскольку script на самом деле представляет собой кортеж с формой:

('myfile0.py', 'pathto\\myfile0.py', 'PYSOURCE')

Возможно, вам также придется запретить включение файлов в PYZ, обратитесь к pyz toc, чтобы узнать, будут ли они включены, мне удалось исключить их, используя excludes=[myfile0] в Analysis().

person jbfuzier    schedule 17.05.2013

Я думаю, что встроенный интерпретатор в исполняемом файле по-прежнему будет искать файлы .py в том же каталоге и/или PYTHONPATH, py2exe использует zip-файл для собственных компонентов Python, iirc pyinstaller встраивает их все в исполняемый файл, возможно, есть возможность сохраните zip, как в py2exe (или не добавляйте их в спецификацию), затем попробуйте запустить приложение без файлов и контролировать доступ к файлам с помощью procmon.

person sherpya    schedule 22.05.2011

pyinstaller предоставляет возможность --exclude для вашего использования case , а также можно установить модуль или пакет , которые вы хотите игнорировать , используя параметр excludes для Analysis() в файле .spec .

person iMath    schedule 20.08.2018