Во-первых, вы должны передать список в Popen
, а не строку. Каждый элемент списка представляет собой один фрагмент команд, которые вы хотите выполнить. В вашем случае это должно быть:
proc = subprocess.Popen(['cd', 'path/to/folder', '&', 'command'])
Второе, если ваша command
является системной командой, такой как cmd
. Вы должны указать Python использовать системную оболочку.
proc = subprocess.Popen(['cd', 'path/to/folder', '&', 'command'], shell=True)
В-третьих, похоже, что вы хотите захватить вывод команды. Прямо сейчас все, что делает команда, будет записано на экран, как если бы вы выполнили команду из оболочки. Чтобы получить Python для захвата выходных данных, нам нужно перенаправить их с записи на экран обратно на Python. Мы делаем это, используя subprocess.PIPE
для потоков stdout
и stderr
.
proc = subprocess.Popen(['cd', 'path/to/folder', '&', 'command'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
Наконец, использование Popen
возвращает объект Popen
. Вы не сразу получите результаты, потому что система может быть за кадром. Использование Popen
позволяет вашему коду продолжать работать (Popen не блокирует). Чтобы получить вывод, вам нужно запустить метод communicate
. Возвращает выходные данные из потоков вывода и ошибок.
out, err = proc.communicate()
Пример:
Изменить каталог и содержимое списка.
proc = subprocess.Popen(['cd', 'Documents/Projects', '&', 'dir'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
out, err = proc.communicate()
print(out.decode('latin-1'))
# prints
Volume in drive C is OS
Volume Serial Number is DE6D-0D88
Directory of C:\Users\james\Documents\Projects
01/04/2020 01:50 PM <DIR> .
01/04/2020 01:50 PM <DIR> ..
11/15/2019 09:05 PM <DIR> .vscode
01/09/2020 11:15 PM <DIR> CondaDeps
01/03/2020 09:22 PM <DIR> Django
12/21/2019 10:52 PM <DIR> FontCluster
12/20/2019 03:56 PM 70 fontcluster.code-workwspace.code-workspace
11/08/2019 03:01 PM <DIR> ScholarCrawler
12/30/2019 10:48 AM 56 scholarcrawler.code-workspace
07/24/2019 09:56 PM <DIR> ThinkStats2
2 File(s) 126 bytes
8 Dir(s) 415,783,694,336 bytes free