Создать запускаемый скрипт GUI из Python setuptools (без окна консоли!)

То, как я сейчас работаю Добавьте исполняемый файл для моего графического интерфейса на основе 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;).

9
задан AndiDog 22 August 2010 в 04:51
поделиться

2 ответа

Хорошо, я немного исследовал исходный код 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 что-то предлагает), но вот что я тогда использовал (скопировано):

File 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 без консоли. Поскольку средства установки не получали обновлений в течение многих лет, это решение все еще работает.

11
ответ дан 3 November 2019 в 00:57
поделиться

Почему бы вам не использовать файл .pyw для Linux и py2exe для Windows?

0
ответ дан 3 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: