Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在subprocess.Popen(stdout=None)中更改stdout=None继承的内容?_Python_Subprocess - Fatal编程技术网

Python 如何在subprocess.Popen(stdout=None)中更改stdout=None继承的内容?

Python 如何在subprocess.Popen(stdout=None)中更改stdout=None继承的内容?,python,subprocess,Python,Subprocess,为什么会这样 >>> sys.stdout=open("/dev/null", "w") >>> subprocess.Popen(["echo", "foobar"], stdout=None) foobar 我希望输出不会出现,而是开始。文档中说,stdout=None将从父级继承句柄 Martijn说,对sys.stdout的赋值不会改变继承的句柄 那么这个句柄是什么,我该如何更改它,以便它被带有stdtout=None的子进程调用继承,并且父进程和子

为什么会这样

>>> sys.stdout=open("/dev/null", "w")
>>> subprocess.Popen(["echo", "foobar"], stdout=None)
foobar
我希望输出不会出现,而是开始。文档中说,
stdout=None
将从父级继承句柄

Martijn说,对sys.stdout的赋值不会改变继承的句柄


那么这个
句柄是什么
,我该如何更改它,以便它被带有
stdtout=None的子进程调用继承,并且父进程和子进程的输出都位于同一位置

否,父进程句柄未转到
/dev/null
。您没有更改进程句柄,只是将Python
sys.stdout
反弹到一个新的文件对象

顺便说一句,您仍然可以在
sys.\uu stdout\uuu
下找到原始的
sys.stdout
对象,并且该对象实际上只是一个包装器,用于将Python字符串对象转换为字符,以写入C中的实际文件句柄

实际的进程句柄是一个文件描述符编号,操作系统为进程指示该文件描述符。要从Python更改该句柄,您必须使用
os.close()
os.dup2()
调用执行一些文件描述符杂耍:

import os

def freopen(filename, mode, fobj):
    new = open(filename, mode)
    newfd = new.fileno()
    targetfd = fobj.fileno()
    os.close(targetfd)
    os.dup2(newfd, targetfd)
然后使用:

freopen('/dev/null', 'w', sys.stdout)
直接将文件对象传递给
子流程将非常容易,但是:

with open("/dev/null", "w") as devnull:
    subprocess.Popen(["echo", "foobar"], stdout=devnull)

否,父进程句柄未转到
/dev/null
。您没有更改进程句柄,只是将Python
sys.stdout
反弹到一个新的文件对象

顺便说一句,您仍然可以在
sys.\uu stdout\uuu
下找到原始的
sys.stdout
对象,并且该对象实际上只是一个包装器,用于将Python字符串对象转换为字符,以写入C中的实际文件句柄

实际的进程句柄是一个文件描述符编号,操作系统为进程指示该文件描述符。要从Python更改该句柄,您必须使用
os.close()
os.dup2()
调用执行一些文件描述符杂耍:

import os

def freopen(filename, mode, fobj):
    new = open(filename, mode)
    newfd = new.fileno()
    targetfd = fobj.fileno()
    os.close(targetfd)
    os.dup2(newfd, targetfd)
然后使用:

freopen('/dev/null', 'w', sys.stdout)
直接将文件对象传递给
子流程将非常容易,但是:

with open("/dev/null", "w") as devnull:
    subprocess.Popen(["echo", "foobar"], stdout=devnull)

sys.stdout
只是一个python对象;真正的神奇发生在文件描述符/描述级别,可以使用
os
模块对其进行操作

理论上,您可以通过执行以下操作将文件描述符1定向到另一个文件:

 sys.stdout.flush()
 fd = os.open("/dev/null", "w")
 sys.stdout = os.fdopen(fd, "w")
 os.dup2(fd, 1)
 os.close(fd)
尽管我不能保证它在任何情况下都能满足你的要求;最好为stdout提供一个新的Python文件,比如:

null = open("/dev/null", "w")
subprocess.Popen(..., stdout=null)
null.close()

stdout
的默认
None
实际上代表继承(不要对打开的文件执行任何操作)。由于
sys.stdout.fileno()
通常是
1
(除非有可疑的事情发生),这通常与
stdout=sys.stdout

sys.stdout
只是一个python对象是一样的;真正的神奇发生在文件描述符/描述级别,可以使用
os
模块对其进行操作

理论上,您可以通过执行以下操作将文件描述符1定向到另一个文件:

 sys.stdout.flush()
 fd = os.open("/dev/null", "w")
 sys.stdout = os.fdopen(fd, "w")
 os.dup2(fd, 1)
 os.close(fd)
尽管我不能保证它在任何情况下都能满足你的要求;最好为stdout提供一个新的Python文件,比如:

null = open("/dev/null", "w")
subprocess.Popen(..., stdout=null)
null.close()

stdout
的默认
None
实际上代表继承(不要对打开的文件执行任何操作)。由于
sys.stdout.fileno()
通常是
1
(除非有可疑的事情发生),这通常与
stdout=sys.stdout

非常抱歉,我找不到任何关于Python“进程句柄”是什么的文档,你能给我指一下吗?我想,这意味着Python脚本内部的
sys.stdout
,如果我更改了它(我可以恢复到
sys.stdout\uuuu
,我知道),那么我就更改了“句柄”。好吧,这一切都很好,但我不明白,为什么在
sys.stdout=open(“/dev/null”,“w”)
调用之后,进程的所有输出都消失了?Python中的所有内容都使用
sys.stdout
对象,但子进程不知道该对象,只能看到C级原始文件句柄。很抱歉,我找不到任何关于Python“进程句柄”是什么的文档,您能给我指一下吗?我想,这意味着Python脚本内部的
sys.stdout
,如果我更改了它(我可以恢复到
sys.stdout\uuuu
,我知道),那么我就更改了“句柄”。好吧,这一切都很好,但我不明白,为什么在
sys.stdout=open(“/dev/null”,“w”)
调用之后,进程的所有输出都消失了?Python中的所有内容都使用
sys.stdout
对象,但子进程不知道该对象,只能看到C级原始文件句柄。