То, как я сейчас работаю Добавьте исполняемый файл для моего графического интерфейса на основе Python:
setup(
# ...
entry_points = {"gui_scripts" : ['frontend = myfrontendmodule.launcher:main']},
# ...
)
В Windows это создаст «frontend.exe» и «frontend-script.pyw» в папке скриптов Python (используя Python 2.6). Когда я выполняю EXE-файл, отображается консольное окно, но PYW-файл работает правильно, не показывая его.
Поэтому мой вопрос: Как я могу заставить EXE-файл выполнять программу без окна консоли? Решение должно работать и в Linux (не предлагайте py2exe;).
Хорошо, я немного исследовал исходный код setuptools, и все сводится к ошибке в setuptools (easy_install.py):
# On Windows/wininst, add a .py extension and an .exe launcher
if group=='gui_scripts':
ext, launcher = '-script.pyw', 'gui.exe'
old = ['.pyw']
new_header = re.sub('(?i)python.exe','pythonw.exe',header)
else:
ext, launcher = '-script.py', 'cli.exe'
old = ['.py','.pyc','.pyo']
new_header = re.sub('(?i)pythonw.exe','python.exe',header)
if os.path.exists(new_header[2:-1]) or sys.platform!='win32':
hdr = new_header
else:
hdr = header
Последний if
определяет, будет ли путь pythonw.exe или python.exe записан в shebang "frontend-script.pyw". Поскольку этот shebang оценивается созданным EXE-файлом, необходимо, чтобы оператор else
не выполнялся. Проблема в том, что new_header [2: -1]
в моем случае был «C: \ Program Files (x86) \ Python26 \ pythonw.exe» (с кавычками!), Поэтому os. path.exists
сказал, что его не существует из-за кавычек.
Я постараюсь исправить это разработчиками setuptools. Остается проблема с абсолютным путем pythonw.exe. Если я создам программу установки Windows или установщик MSI, shebang будет содержать мой путь к pythonw.exe («C: \ Program Files (x86) \ Python26 \ pythonw.exe»), но пользователь мог установить Python в «C: \ Python26. ". Я сообщу об окончательном решении после того, как сообщу об этой проблеме.
Я опубликовал это более двух лет назад, извините, что еще не предложил свое решение. Не уверен, есть ли более современное решение (вероятно, distribute что-то предлагает), но вот что я тогда использовал (скопировано):
dogsync-frontend-script.pyw
#!pythonw.exe
# This script will be executed by the primary Python version that is installed, which might as well be Python 3. But
# we want to execute it with the Python version that belongs to this script's path. So let's do a major hack:
import os
import sys
import subprocess
if sys.argv[-1] == "magic":
from dogsync_frontend.launcher import main
main()
else:
# The CPython folder hierarchy is assumed here (<installation>\pythonw.exe, <installation>\Scripts\<thisscript>)
subprocess.Popen([os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "pythonw.exe")),
__file__,
"magic"])
Dogsync-frontend.exe
Автоматически копируется из <установка python> \ lib \ site-packages \ setuptools \ gui.exe
(см. ниже). Этот файл автоматически выполнит сценарий <имя EXE> -script.py [w]
, если я правильно помню.
setup.py
from setuptools import __file__ as setupToolsFilename
if os.name == "nt":
# Use a customized (major hack) start script instead of the one that gets automatically created by setuptools
# when the "gui_scripts" parameter is used. This way, we don't need setuptools installed in order to run DogSync.
shutil.copy2(os.path.join(os.path.dirname(setupToolsFilename), "gui.exe"),
"build-environment/windows-scripts/dogsync-frontend.exe")
startScripts = dict(scripts = ["build-environment/windows-scripts/dogsync-frontend-script.pyw",
"build-environment/windows-scripts/dogsync-frontend.exe"])
else:
# For Linux, I don't have a solution to remove the runtime dependency on setuptools (yet)
startScripts = dict(entry_points = {"gui_scripts" : ['dogsync-frontend = dogsync_frontend.launcher:main']})
setup(<other options>,
**startScripts)
При этой настройке файлы exe / pyw копируются в <установка python> \ Scripts
(в Windows) и запускаются Dogsync-frontend. exe
запустит сценарий pyw без консоли. Поскольку средства установки не получали обновлений в течение многих лет, это решение все еще работает.
Почему бы вам не использовать файл .pyw
для Linux и py2exe
для Windows?