#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() вы используете кавычки так же, как при работе в оболочке