Как запустить консольные EXE-файлы, не создавая новое окно консоли?
У меня есть сценарий Python, который обычно вызывается из Windows PowerShell, с некоторыми аргументами командной строки. Я хочу распространять этот скрипт в формате.exe, и я хочу сохранить для его использования тот же "пользовательский интерфейс", основанный на консоли.
- Пользователь открывает Windows Powershell.
Пользователь вызывает программу myscript.exe из оболочки:
myscript.exe argument1 argument2 argument3
Программа выполняется в той же консоли и записывает свой вывод в той же консоли.
На самом деле у меня есть программа 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
,