将函数的返回值传递给Python中的子进程

问题描述

免责声明:刚开始学习python时,请原谅我一些笨拙的问题或解释。

EDIT-我只是解决了我遇到的核心问题,例如:

def to():
    print('To...')
    
    data = ' '.join(req(urls))
    
    p2 = subprocess.run(['bash-tool'],text=True,capture_output=True,input=data)
    p3 = subprocess.run(["another-tool"],input=p2.stdout)

    with open(test + '-check','w') as f:
        subprocess.run(['sort','-u'],stdout=f,input=p3.stdout)
    another-func()

不确定这是否是正确的方法。正如我认为的那样,如果有大量的URL(> 10k),它就会崩溃。而且可能会很慢吗?

我要实现什么目标?

要请求一些url(以快速异步方式或使用线程/多处理),请保存响应,对其中的某些内容进行grep,然后将其保存到文本文件中。可以使用bash轻松完成,但是我希望它可以扩展以用于将来的添加和学习python,python网络和多线程/处理的概念。

问题:

以下函数执行get请求并返回页面正文。

import subprocess
from multiprocessing.dummy import Pool as ThreadPool

def req(urls):
    print('\nRequesting...')

    results = pool.map(requests.get,urls)
    return [(result.text) for result in results]

我想将结果(或精确地说是管道)或返回值传递给另一个函数,该函数具有对bash命令/工具的子进程调用。(类似echo 'abc' | bash-tool | another-tool | sort -u >> out.txt

def to():
    print('To...')
    
    <Cat the return value here and pass it to below subprocesses>
    
    p2 = subprocess.run(['bash-tool'],input=p1.stdout)
    p3 = subprocess.run(["another-tool"],input=p3.stdout)
    another-func()

因此整个程序将类似于:

import os
import argparse
from multiprocessing.dummy import Pool as ThreadPool
import subprocess
import requests

def req(urls):
    print('\nRequesting...')

    results = pool.map(requests.get,urls)
    return [(result.text) for result in results]


def to():
    print('To...')
    
    <Cat the return value here and pass it to below subprocesses>
    
    p2 = subprocess.run(['bash-tool'],input=p3.stdout)
    another-func()


def another-func():
     
    <Some more bash-fu>


def main():
    with open(dom,'r') as fl:
        urls=fl.read().splitlines()
    req(urls)


if __name__ == '__main__':

    pool = ThreadPool(int(threads))
    main()

我可以将req()的返回值存储到To()中的变量中,例如data = req(urls),但是如何echo permit的值要使用子进程通过管道传递?

也请让我知道我是否正在以某种不好的逻辑接近它?任何帮助将不胜感激!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)