Как мне выполнить программу на Python?ос. сбой системы из-за пробелов в пути

StackOverflow https://stackoverflow.com/questions/204017

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top