Как запустить exe-файл из python? - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь запустить exe (в фоновом режиме) по определенному пути в моем локальном проекте на python с помощью библиотеки os.system. Мне удалось изменить папки, такие как команда «cd», но я не могу запустить файл.

Это для проекта Python, работающего на Windows 64BIT, Python 3.5.3

файл.exe находится в каталоге «Programs».

import os
os.system("cd C:\Users\User\AppData\Windows\Start Menu\Programs")
subprocess.Popen("file.exe")

Ошибка:

{OSError} [WinError 193]% 1 не является допустимым приложением Win32

Я видел другие сообщения об этой проблеме, но я не мог решить ее. Есть идеи?

Ответы [ 3 ]

6 голосов
/ 04 ноября 2019

Проблема в том, что команда system не работает. Это «работает», но в отдельном подпроцессе, который выходит сразу. Текущий каталог не распространяется до вызывающего процесса (также, так как вы не проверяете код возврата, команда не завершится ошибкой, даже с несуществующим каталогом. Обратите внимание, что это происходит здесь, так как имя каталога имеетпробелы в нем и не заключены в кавычки ...).

Для этого вам придется использовать os.chdir, но вам это даже не нужно.

Если вы хотите запуститькоманду в определенном месте, просто передайте абсолютный путь к команде (и поскольку она использует строковые литералы, всегда используйте префикс r, чтобы избежать того, что некоторые символы \t или \n интерпретируются как специальные символы ...),Например, для Python 3, при условии, что в командной строке есть ошибка (но нормально в Python 2 ...):

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 5-6: truncated \UXXXXXXXX escape

Поэтому всегда используйте raw-префикс. Вот как я бы переписал это:

current_dir = r"C:\Users\User\AppData\Windows\Start Menu\Programs"
subprocess.Popen(os.path.join(current_dir,"file.exe"))

И если вам действительно нужно, чтобы текущий каталог был таким же, как exe, используйте параметр cwd. Также получите возвращаемое значение Popen, чтобы иметь возможность ждать / опросить / убить / что угодно и получить код завершения команды:

p = subprocess.Popen(os.path.join(current_dir,"file.exe"),cwd=current_dir)
# ...
return_code = p.wait()

В качестве примечания, обратите внимание, что:

p = subprocess.Popen("file.exe",cwd=current_dir)

не работает, даже если file.exe находится в current_dir (если вы не установили shell=True, но лучше этого избежать также по соображениям безопасности / переносимости)

Обратите внимание, что os.systemне рекомендуется по многим (веским) причинам. Используйте модуль subprocess, всегда , и, если есть аргумент, всегда с аргументом список (не строка) и избегайте shell=True в максимально возможной степени.

2 голосов
/ 04 ноября 2019

Можете ли вы увидеть, если это работает

   import os 

    # change the current directory 
    # to specified directory 
    os.chdir(r"C:\Users\User\AppData\Windows\Start Menu\Programs") 
    subprocess.Popen("file.exe")
0 голосов
/ 06 ноября 2019

Проблема решена. Спасибо всем, проблема была в административных привилегиях .. Начал pycharm как администратор. И, как я сказал - я смог увидеть файл с помощью os.listdir (), но когда я пытаюсь его запустить, появляются ошибки. Я думаю, что основная проблема заключается в том, что os.system () наследует текущие привилегии от процесса Python.

...