Подпроцесс Python и пути к файлам с круглыми или круглыми скобками [Windows или Linux] - PullRequest
0 голосов
/ 20 июня 2019

У меня была проблема с вызовом скрипта 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 проверить, сопоставимо ли поведение.

1 Ответ

0 голосов
/ 20 июня 2019

Если в имени файла есть «, введите имя в« », а если« в »укажите имя в«

...