如何在 python 中的子进程调用期间阻止 stdout 显示我的密码? [复制]
Posted
技术标签:
【中文标题】如何在 python 中的子进程调用期间阻止 stdout 显示我的密码? [复制]【英文标题】:How do I block stdout from showing my password during my subprocess call in python? [duplicate] 【发布时间】:2014-04-09 21:07:22 【问题描述】:我想阻止在我运行 subprocess.call()
时变得可见的输出。
这是我想要停止的唯一输出,因为我需要显示之后运行的命令。
调用显示我已设置为系统变量的密码,该密码在正在执行的文件中隐藏为 %%mypassword%%(但是,它显示在命令行界面中)。
from subprocess import call
with open('//path/pwhold.txt','w') as pwhold:
call(r"\\filetorun\%s.bat" % DB,stdout=pwhold)
os.unlink('//path/pwhold.txt')
这种工作方式,但文件在文件执行完成后才会被删除。
还有其他方法可以做到这一点吗?
【问题讨论】:
只需使用os.devnull
而不是'//path/pwhold.txt'
,如the page I've linked above 中所述。
【参考方案1】:
根据 Sebastion 的 cmets。 subprocess.call()
使用的接口需要一个实际的文件句柄才能在操作系统级别捕获输出。执行命令时尝试使用字符串或字符串缓冲区失败。
忽略:这不起作用: 将 STDOUT 重定向到字符串而不是文件。这样你的信息只会出现在内存中。请参阅this 问题。
TLDR 使用:
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)
【讨论】:
替换sys.stdout
不会影响子进程。 OP 可以use os.devnull
file instead。一般来说,如果你想redirect at C level, you need something like os.dup()
on Unix(它可能适用于Windows,我没有尝试过)
你是对的。但是如果你说 mystdout = StringIO() 然后将调用修改为 call(r"\\filetorun\%s.bat" % DB,stdout=mystdout) 这种方法是否可行?
执行此操作后: mystdout = StringIO() 这不起作用: call(r"\\filepathxxx\temp\%s.bat" % DB,stdout=mystdout) 就是您所说的关于?你能告诉我这是如何实现的吗?
-1:看来我还不够清楚。您的解决方案不起作用。要查看它,您可以尝试运行任何打印内容的子进程。
谢谢,其他帖子“如何在 Python 2.7 中隐藏子进程的输出”的 FNULL 解决方案有效。:FNULL=open(os.devnull,'w'); subprocess.call(r"file.bat",stdout=FNULL,stderr=subprocess.STDOUT); FNULL.close()以上是关于如何在 python 中的子进程调用期间阻止 stdout 显示我的密码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中杀死使用 subprocess.call 调用的子进程? [复制]
Python 2.7:调用 subprocess.popen 阻止文件访问