У меня была проблема с вызовом скрипта python 2.7 с методами модуля подпроцесса в Debian linux WM. Путь к файлу содержит круглые скобки и пробелы, и даже с использованием различных методов, описанных здесь ( Обработка путей к файлам с круглыми скобками с подпроцессом Python ; Путь Windows в Python ), установив для оболочки значение True или False, используя строку в качестве входных данных (с необработанными строками, экранированными строками вручную или с помощью re.escape ()) или в качестве списка аргументов, но я не смог заставить его работать, поэтому я прибегнул к rm и переименовал свои файлы, заменив круглые скобки с подчеркиванием. Это сработало тогда, но я не удовлетворен тем, что застрял на такой проблеме.
Итак, я пытаюсь в ноутбуке Jupyter с Python 3.6 и Windows, чтобы попытаться выяснить, действительно ли я глуп или если есть проблемы с конфигурацией.
Вот мои наблюдения, ниже с моим пониманием.
Не стесняйтесь использовать его, чтобы помочь себе или комментировать
proc = sp.Popen("help", stdout =sp.PIPE, shell = True)
proc = sp.Popen("help", stdout =sp.PIPE, shell = False)
#both works
##OK!>
basicproc2_1 = sp.Popen(['md', 'basictest2_1'], shell=True, stdout =sp.PIPE)
#OK
#basicproc2_2 = sp.Popen(['md', 'basictest2_2'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
##Quoted paths,escaped or not; shell False or True
###input as a list
#proc = sp.Popen(['md', '"test1 (1)"'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
proc2_1 = sp.Popen(['md', '"test2 (1)"'], shell=True, stdout =sp.PIPE)
#create directory "(1)" which is stupid
proc2_2 = sp.Popen(['md', '"test2_2"'], shell=True, stdout =sp.PIPE)
#doesn't create directory either
#proc3 = sp.Popen(['md', '"test3\ \(1\)"'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
proc4 = sp.Popen(['md', '"test4\ \(1\)"'], shell=True, stdout =sp.PIPE)
#doesn't throw FileNotFoundError but doesn't create any file or directory, which is by far the strangest result
###input as a string
#proc5 = sp.Popen(['md "test5 (1)"'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#proc6 = sp.Popen(['md "test6 (1)"'], shell=True, stdout =sp.PIPE)
#doesn't throw FileNotFoundError but doesn't create any file or directory, which is by far the strangest result
#proc7 = sp.Popen(['md "test7\ \(1\)"'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#proc8 = sp.Popen(['md "test8\ \(1\)"'], shell=True, stdout =sp.PIPE)
#doesn't throw FileNotFoundError but doesn't create any file or directory, which is by far the strangest result
##Unquoted paths,escaped or not; shell False or True
###input as a list
#proc9 = sp.Popen(['md', 'test9 (1)'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#OK!>
#proc10 = sp.Popen(['md', 'test10 (1)'], shell=True, stdout =sp.PIPE)
#create directory "test10 (1)" which is OK!!!!!!!!!!!!
#proc11 = sp.Popen(['md', 'test11\ \(1\)'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#proc12 = sp.Popen(['md', 'test12\ \(1\)'], shell=True, stdout =sp.PIPE)
#create 'test12' directory which is wrong
###input as a string
#proc13 = sp.Popen('md test13 (1)', shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#proc14 = sp.Popen('md test14 (1)', shell=True, stdout =sp.PIPE)
#create directories 'test14' and '(1)'
#proc15 = sp.Popen('md test15\ \(1\)', shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#proc16 = sp.Popen('md test16\ \(1\)', shell=True, stdout =sp.PIPE)
#create 'test16' directory which is wrong
#mixing input string and list (not doing the quoted versions)
#proc5 = sp.Popen(['md test17 (1)'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#proc6 = sp.Popen(['md test6 (1)'], shell=True, stdout =sp.PIPE)
#doesn't throw FileNotFoundError but doesn't create any file or directory, which is by far the strangest result
#proc7 = sp.Popen(['md test7\ \(1\)'], shell=False, stdout =sp.PIPE)
#throws FileNotFoundError
#proc8 = sp.Popen(['md test8\ \(1\)'], shell=True, stdout =sp.PIPE)
#doesn't throw FileNotFoundError but doesn't create any file or directory, which is by far the strangest result
Следовательно, до тех пор, пока у вас есть аргументы, не следует рассматривать shell = False (вопреки тому, что я читал ранее).
Лучше использовать ввод как список без кавычек, неэкранированный аргумент. Побег будет мешать с результатом, и цитируемые данные не будут приняты во внимание.
Сейчас я попробую на linux проверить, сопоставимо ли поведение.