Использование «subprocess.run» с аргументом, включающим пробел

#python #subprocess

Вопрос:

При использовании subprocess.run в Python, как выполнить команду, в которой один из аргументов содержит пробел?

Например, я хочу создать файл с именем test file (включая пробел). В скорлупе вы бы сделали:

 touch 'test file'
 

Используя subprocess.run в Python, я пробовал:

 import subprocess
subprocess.run(["touch", "'test file'") # Creates a file called `'test file'` (inc. quotes)
subprocess.run(["touch", "test file") # Creates a file called `test me`
subprocess.run(["touch", "test", "file") # Creates two files `test` and `file`
subprocess.run(["touch", "'test", "file'") # Creates two files `'test` and `file'`
 

Комментарии:

1. Весь смысл предоставления списка аргументов различным subprocess функциям заключается в том, что вам не нужно беспокоиться об их разделении — каждый аргумент принимается точно таким, как он есть.

2. Есть ли действительно веская причина , по которой вы обращаетесь к оболочке для создания файла? Вы можете сделать это гораздо проще, вызвав open() Python, и это позволит избежать любых загадок о том, как то, что вы передаете subprocess() , анализируется оболочкой.

3. @jasonharper Это было мне непонятно раньше (даже после просмотра документов о подпроцессе), но теперь

4. @BoarGules мой реальный вариант использования-не создавать файл. Я просто использую это как простой пример, чтобы объяснить проблему

Ответ №1:

Нет необходимости использовать кавычки для указания аргумента, который содержит пробел, поскольку он рассматривается как строковый литерал, просто сделайте:

 subprocess.run(["touch", "test file"])
 

Это создает файл с именем test file .

Комментарии:

1. Это верно для подпроцесса.run(), но обратите внимание, что при использовании os.system() вы используете кавычки так же, как при работе в оболочке