Проблема в том, что команда 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
в максимально возможной степени.