Возможность обработки списка команд с помощью подпроцесса. Открыть для python3 .7 - PullRequest
0 голосов
/ 03 марта 2020

Я хочу записать содержимое команды curl, примененной к нескольким URL-адресам, в один файл, например, у меня есть

 days = [f'from-{x+1}d-to-{x}'for x in range(5, 0, -1)]

 urls = [f'https:\\example.com?{day}/data' for day in days]

 command = [f'curl {url}' for url in urls]

 command

['curl https:\\example.com?from-6d-to-5/data', 'curl https:\\example.com?from-5d-to-4/data', 'curl https:\\example.com?from-4d-to-3/data', 'curl https:\\example.com?from-3d-to-2/data', 'curl https:\\example.com?from-2d-to-1/data']

И я пытаюсь записать все это только в один файл:

content = subprocess.Popen(([x for x in command]), shell = True, text = True, stdout = subprocess.PIPE).communicate()
 file_name = open('file_1', 'a') 
 file_name.write(str(content))

, но выглядит как подпроцесс. Openen выполняет только первую команду curl, поскольку я вижу только один вывод в консоли:

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 12591 0 12591 0 0 20931 0 --:--:-- --:--:-- --:--:-- 20915

Есть ли способ выполнить несколько команд с подпроцессом. Открыть? Я предполагаю, что должно быть то же количество выводов консоли, что и количество URL, которые нужно свернуть

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Из официальной документации:

subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

Выполнить дочернюю программу в новом процессе. В POSIX класс использует os.execvp () -подобное поведение для выполнения дочерней программы. В Windows класс использует функцию Windows CreateProcess (). Аргументы Popen следующие:

args должна быть последовательностью программных аргументов или же одиночной строкой или объектом в виде пути. По умолчанию, программа для выполнения является первым элементом в args, если args - последовательность. Если args является строкой, интерпретация зависит от платформы и описана ниже. См. Shell и исполняемые аргументы для дополнительных отличий от поведения по умолчанию. Если не указано иное, рекомендуется передавать аргументы в виде последовательности.

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

Отвечая @Maurice, вы можете использовать urllib, чтобы получить URL-ответ. Если вы все еще хотите использовать подпроцесс для этой цели, тогда могут потребоваться изменения, такие как

responses = [str(subprocess.Popen(x.split(" "), shell = True, text = True, stdout = subprocess.PIPE).communicate()) for x in commands]

file_name = open('file_1', 'a')
file_name.writelines(responses)

Это может быть не очень хорошим вариантом, если у вас много URL-адресов для обработки.

1 голос
/ 03 марта 2020

Вы можете использовать urllib непосредственно в Python, обычно нет необходимости использовать подпроцесс / curl:

import urllib.request

days = [f'from-{x+1}d-to-{x}'for x in range(5, 0, -1)]
urls = [f'https://example.com?{day}/data' for day in days]

for url in urls:
    with urllib.request.urlopen(url) as response:
       print(response.read())
...