gpt4 book ai didi

python - 阐明在 Python 中使用管道和子进程?

转载 作者:太空宇宙 更新时间:2023-11-04 06:30:34 24 4
gpt4 key购买 nike

我正在研究子流程和管道背后的概念,并在 Python 上下文中使用它们。如果有人能阐明这些问题,那真的会对我有所帮助。

  1. 假设我有一个管道设置如下

    createText.py |处理文本.py |猫

    processText.py 是通过stdin 接收数据,但这是如何实现的呢?它怎么知道不会有更多的数据到来并且它应该退出?我的猜测是它可能会寻找一个 EOF 并基于它终止,但是如果 createText.py 从未发送过 EOF 怎么办?这会被认为是 createText.py 的错误吗?

  2. 假设 parent.py 启动子进程 (child.py) 并调用 wait() 等待子进程完成。如果 parent 将 child 的 stdout 和 stderr 作为管道捕获,那么在 child 终止后从中读取它们是否仍然安全?或者当一端终止时管道(和其中的数据)是否被破坏?

  3. 我想解决的一般问题是编写一个 python 脚本,使用 Popen 类多次调用 rsync。我希望我的程序等到 rsync 完成,然后我想检查返回状态以查看它是否正确退出。如果没有,我想阅读 child 的 stderr 以查看错误是什么。这是我目前所拥有的

    # makes the rsync call.  Will block until the child
    # process is finished. Returns the exit code for rsync
    def performRsync(src, dest):
    print "Pushing " + src + " to " + dest
    child = Popen(['rsync', '-av', src, dest], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    child.wait()
    ## check for success or failure
    ## 0 is a successful exit code here
    if not child.returncode:
    return True
    else:#ballz
    stout, sterr = child.communicate()
    print "ERR pushing " + src + ". " + sterr
    return False
  4. 更新:我也遇到过这个问题。考虑这两个简单的文件:

    # createText.py
    for x in range(1000):
    print "creating line " + str(x)
    time.sleep(1)

    # processText.py
    while True:
    line = sys.stdin.readline()
    if not line:
    break;
    print "I modified " + line

    为什么在这种情况下 processText.py 在从标准输入获取数据时没有开始打印?管道在传递数据之前是否会收集一些缓冲数据?

最佳答案

这假定一个 UNIXish/POSIXish 环境。

管道中的 EOF 表示没有更多数据可读,即 read() 返回长度 0。这通常发生在左侧进程退出并关闭其标准输出时。由于您无法从另一端关闭的管道读取数据,因此 processText 中的 read 指示 EOF。

如果 createText 不退出从而关闭其输出,它将是一个无休止的程序,这在管道中是一件坏事。即使不在流水线中,永不结束的程序通常也不正确(yes(1) 之类的奇怪情况除外)。

只要您没有收到 EOF 或 IOError(errno.EPIPE) 指示,您就可以从管道读取,这也表明没有任何内容可读。

我没有测试过你的代码,它会做一些意想不到的事情吗?

关于python - 阐明在 Python 中使用管道和子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3482266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com