在python中调用子进程时,如何阻止stdout显示密码?

在python中调用子进程时,如何阻止stdout显示密码?,python,subprocess,Python,Subprocess,我想阻止在运行subprocess.call()时可见的输出 这是我想要停止的唯一输出,因为我需要在之后运行的命令来显示 该调用显示我的密码,我已将其设置为系统变量,在执行文件中隐藏为%%mypassword%%(但是,它会显示在命令行界面中) 这类操作有效,但在文件执行完成之前不会删除该文件 还有其他方法吗 根据塞巴斯蒂安的评论。subprocess.call()使用的接口需要实际的文件句柄,以便在操作系统级别捕获输出。执行命令时,尝试使用字符串或字符串缓冲区失败 忽略:这不起作用: 将标准输

我想阻止在运行
subprocess.call()时可见的输出
这是我想要停止的唯一输出,因为我需要在之后运行的命令来显示

该调用显示我的密码,我已将其设置为系统变量,在执行文件中隐藏为%%mypassword%%(但是,它会显示在命令行界面中)

这类操作有效,但在文件执行完成之前不会删除该文件


还有其他方法吗

根据塞巴斯蒂安的评论。
subprocess.call()
使用的接口需要实际的文件句柄,以便在操作系统级别捕获输出。执行命令时,尝试使用字符串或字符串缓冲区失败

忽略:这不起作用: 将标准输出重定向到字符串而不是文件。这样,您的信息只会出现在内存中。见问题

TLDR用途:

from cStringIO import StringIO
import sys

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()


替换
sys.stdout
不会影响子进程。奥普可以。一般来说,如果你想(它可能在Windows上工作,我没有试过)你是对的。但是如果您说mystdout=StringIO(),然后将调用修改为call(r“\\filetorun\%s.bat”%DB,stdout=mystdout),这种方法会正常工作吗?执行此操作后:mystdout=StringIO()这不起作用:call(r“\\filepathxxx\temp\%s.bat”%DB,stdout=mystdout)这就是您所说的吗?你能告诉我这是怎么实现的吗?1:看来我还不够清楚。您的解决方案不起作用。要查看它,您可以尝试运行任何打印内容的子流程;调用(r“file.bat”,stdout=FNULL,stderr=subprocess.stdout);FNULL.close()只需使用
os.devnull
而不是中所述的
'//path/pwhold.txt'
from cStringIO import StringIO
import sys

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
from io import TextIOWrapper, BytesIO

# setup the environment
old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)