Как мне выполнить программу на Python?ос. сбой системы из-за пробелов в пути
-
03-07-2019 - |
Вопрос
У меня есть скрипт на Python, который должен выполнить внешнюю программу, но по какой-то причине терпит неудачу.
Если у меня есть следующий скрипт:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Затем он завершается сбоем со следующей ошибкой:
'C: emp\a' не распознается как внутренняя или внешняя команда, работоспособная программа или пакетный файл.
Если я выйду из программы с помощью кавычек:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Тогда это работает.Однако, если я добавлю параметр, он снова перестанет работать:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Как правильно выполнить программу и дождаться ее завершения?Мне не нужно читать выходные данные из него, так как это визуальная программа, которая выполняет задание, а затем просто завершает работу, но мне нужно дождаться его завершения.
Также обратите внимание, что перемещение программы по пути без интервалов также не является вариантом.
Это тоже не работает:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Обратите внимание на замененные одинарные / двойные кавычки.
С параметром для Notepad или без него здесь происходит сбой с сообщением об ошибке
Неверен синтаксис имени файла, каталога или метки тома.
Решение
subprocess.call
это позволит избежать проблем, связанных с необходимостью иметь дело с соглашениями о цитировании различных оболочек.Он принимает список, а не строку, поэтому аргументы легче разделять.т. е.
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Другие советы
Вот другой способ сделать это.
Если вы используете Windows, выполните следующие действия, например, дважды щелкнув файл в Проводнике или указав имя файла в качестве аргумента команде DOS "Пуск":файл открывается любым приложением (если таковое имеется), с которым связано его расширение.
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Пример:
import os
os.startfile('textfile.txt')
Это откроется textfile.txt с помощью Notepad, если Notepad связан с текстовыми файлами.
Самые внешние кавычки используются самим Python, и оболочка Windows этого не видит.Как упоминалось выше, Windows понимает только двойные кавычки.Python преобразует косую черту в обратную в Windows, так что вы можете использовать
os.system('"C://Temp/a b c/Notepad.exe"')
' используется Python, который затем передает "C://Temp/a b c/Notepad.exe" (как путь к Windows, двойные обратные косые черты не требуются) в CMD.EXE
По крайней мере, в Windows 7 и Python 3.1, os.system
в Windows требуется командная строка заключенный в двойные кавычки если в пути к команде есть пробелы.Например:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
Реальным примером, который поставил меня в тупик, было клонирование диска в VirtualBox.Тот Самый subprocess.call
вышеприведенное решение не сработало из-за какой-то проблемы с правами доступа, но когда я заключил команду в двойные кавычки, os.system
стал счастливым:
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
Я подозреваю, что это та же проблема, что и при использовании ярлыков в Windows...Попробуй это:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Для python >= 3.5 subprocess.run
следует использовать вместо subprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
Предположим, мы хотим запустить ваш веб-сервер Django (в Linux), чтобы между вашим path (путь='/home/<you>/<first-path-section> <second-path-section>'
), поэтому выполните следующие действия:
import subprocess
args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
[Примечание]:
- Не забудьте получить разрешение на доступ:
chmod 755 -R <'yor path'>
manage.py
является исключительным:chmod +x manage.py