Как запустить консольные EXE-файлы, не создавая новое окно консоли?

У меня есть сценарий Python, который обычно вызывается из Windows PowerShell, с некоторыми аргументами командной строки. Я хочу распространять этот скрипт в формате.exe, и я хочу сохранить для его использования тот же "пользовательский интерфейс", основанный на консоли.

  1. Пользователь открывает Windows Powershell.
  2. Пользователь вызывает программу myscript.exe из оболочки:

    myscript.exe argument1 argument2 argument3
    
  3. Программа выполняется в той же консоли и записывает свой вывод в той же консоли.

На самом деле у меня есть программа myscript.exe, которая, конечно, получает аргументы из PowerShell, но, к сожалению, выполняет программу в другой консоли, которая создается при вызове.

Как я могу избежать такого поведения и держать все в одной консоли?

РЕДАКТИРОВАТЬ: я следовал учебник на http://www.py2exe.org/index.cgi/Tutorial.

Для моего файла сборки setup.py я использовал:

  • console ключевое слово (предоставление myscript.py в качестве единственного элемента в списке)
  • zipfile Ключевое слово (установлено в True)
  • options ключевое слово с optimize: 2, bundle_files: 1, а также compressed: True,

Компиляция работает нормально, и программа делает то, что должна делать. Единственное нежелательное - это открытие выделенной консоли вместо выполнения в той же консоли.

РЕДАКТИРОВАТЬ 2: Вот именно мой код setup.py.

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True, 'optimize': 2}},
    console = [{'script': "myscript.py"}],
    zipfile = None,
)

Я просто вызываю скрипт, набирающий:

python setup.py 

в Windows Powershell

EDIT3: это было сделано в Windows 8.1 с:

  • Python 3.4.2
  • py2exe 0.9.2.2
  • Powershell 4.0

Последний исполняемый файл также был протестирован в системе Windows 10 без установки Python; это работало, но показывало то же самое поведение порождения консоли.

2 ответа

Решение

Кажется, что я сам нашел ответ с помощью этого ответа, связанного этим ответом. Проблема была также связана с этим другим вопросом. Общая причина породила две разные, но связанные проблемы.

Это вызвано именем файла.exe. Переключение на другое имя файла останавливает UAC для запроса прав администратора и запускает программное обеспечение в той же оболочке.

Имя было:

<project_name_under_NDA>_update.exe

Но переход на

try.exe

Это сработало.

Надеюсь, что следующее может помочь. У меня нормально работает как в стандартном Windows Command Promptи при использовании Windows PowerShell:

test.py

import sys

print "Arguments passed:"

for arg in sys.argv:
    print '  {}'.format(arg)

setup.py

from distutils.core import setup
import py2exe

setup(
    zipfile = None,
    options = {"py2exe": {"bundle_files": 1}},
    console = [r'test.py'])

Он создан с использованием:

python setup.py py2exe

Вот пример выполнения:

PS E:\test> .\test.exe hello world
Arguments passed:
  E:\test\test.exe
  hello
  world

Если при этом все еще создается отдельная оболочка, существуют ли какие-либо переменные среды параметров PowerShell, которые могли бы изменить ваш результат?

Я проверил это в Python 2.7.9 |Anaconda 2.2.0 (32-bit) а также py2exe 0.6.9,

Другие вопросы по тегам