Python запустить команду оболочки через указанную папку c - PullRequest
0 голосов
/ 14 января 2020

Прежде всего, моя компания использует 2.7.x версию python. И я хочу запустить команду оболочки в указанной папке c.

$ cd path/to/folder & command

И я также получаю строки результата.

Я пробовал, как показано ниже.

result = subprocess.Popen("cd path/to/folder & command")

Но есть ошибка.

File "C:\Python27_x64\lib\subprocess.py", line 711, in __init__ errread, errwrite)
File "C:\Python27_x64\lib\subprocess.py", line 959, in _execute_child startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

Как я могу решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 14 января 2020

Popen имеет аргумент ключевого слова cwd.

result = subprocess.Popen("command", cwd="path/to/folder")

И ошибка, которую вы получаете, заключается в том, что для ключевого слова Popen s shell по умолчанию установлено значение false, поэтому он не знает команду cd.

2 голосов
/ 14 января 2020

Во-первых, вы должны передать список в 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
0 голосов
/ 14 января 2020

Лучше использовать модуль os для смены каталога. Пример ниже:

import os
os.chdir(path)

Если вы выполняете некоторые команды / сценарии, тогда go с subprocess.

0 голосов
/ 14 января 2020

Вы должны изменить рабочий каталог в ответ на вопрос здесь , а затем выполнить команду с subprocess.Popen().

os.chdir("path/to/folder")
result = subprocess.Popen("command")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...