使用subprocess.Popen for python3.7处理命令列表的可能性

问题描述 投票:0回答:2

我想将应用于多个URL的curl命令中的内容写入一个文件,例如我有

 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))

但是看起来像subprocess。Popen只执行第一个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

是否可以通过subprocess.Popen执行多个命令?我想控制台输出应该与要卷曲的URL数量相同

python curl subprocess popen
2个回答
1
投票

您可以直接在Python中使用urllib,通常不需要使用subprocess / 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())

0
投票

摘自官方文档:

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中的item。如果args是字符串,则解释与平台有关,在下面进行介绍。看到外壳程序和可执行文件参数与默认行为。除非另有说明,否则建议通过args作为序列。

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,这可能不是一个好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.