Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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将两个值传递给stdin_Python_Subprocess - Fatal编程技术网

如何在python中使用subprocess将两个值传递给stdin

如何在python中使用subprocess将两个值传递给stdin,python,subprocess,Python,Subprocess,我正在执行一个脚本,它一个接一个地提示输入2个值。我想从脚本本身传递值,因为我想自动化它 使用子流程模块,我可以轻松地传递一个值: suppression_output = subprocess.Popen(cmd_suppression, shell=True, stdin= subprocess.PIPE, stdout= subprocess.PIPE).communicate('y') [0] 但传递第二个值似乎不起作用。如果我这样做: suppress

我正在执行一个脚本,它一个接一个地提示输入2个值。我想从脚本本身传递值,因为我想自动化它

使用子流程模块,我可以轻松地传递一个值:

suppression_output = subprocess.Popen(cmd_suppression, shell=True,
        stdin= subprocess.PIPE,
        stdout= subprocess.PIPE).communicate('y') [0]
但传递第二个值似乎不起作用。如果我这样做:

suppression_output = subprocess.Popen(cmd_suppression, shell=True,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE).communicate('y/r/npassword')[0]
import subprocess
cmd_suppression="python ./testscript.py"
process=subprocess.Popen(cmd_suppression,shell=True\
,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
response=process.communicate("y\npassword")
print response[0]

新行应使用\n而不是/r/n->“y\n密码”

由于您的问题不清楚,我假设您有一个类似于此python脚本的程序,我们称之为script1.py:

import getpass
import sys
firstanswer=raw_input("Do you wish to continue?")
if firstanswer!="y":
  sys.exit(0)   #leave program
secondanswer=raw_input("Enter your secret password:\n")
#secondanswer=getpass.getpass("Enter your secret password:\n")
print "Password was entered successfully"
#do useful stuff here...
print "I should not print it out, but what the heck: "+secondanswer
它要求确认(“y”),然后要求您输入密码。之后,它会执行“有用的操作”,最后打印密码,然后退出

现在,要让第二个脚本script2.py运行第一个程序,它必须看起来像这样:

suppression_output = subprocess.Popen(cmd_suppression, shell=True,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE).communicate('y/r/npassword')[0]
import subprocess
cmd_suppression="python ./testscript.py"
process=subprocess.Popen(cmd_suppression,shell=True\
,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
response=process.communicate("y\npassword")
print response[0]
script2.py的输出:

$ python ./script2.py
Do you wish to continue?Enter your secret password:
Password was entered successfully
I should not print it out, but what the heck: password
如果程序使用一种特殊的方法以安全的方式获取密码,也就是说,如果它使用我刚才在script1.py中注释掉的行,则很可能出现问题

secondanswer=getpass.getpass("Enter your secret password:\n")
本例告诉您,无论如何,通过脚本传递密码可能不是一个好主意

还要记住,使用shell=True选项调用subprocess.Popen通常也是个坏主意。使用shell=False并将命令作为参数列表提供:

cmd_suppression=["python","./testscript2.py"]
process=subprocess.Popen(cmd_suppression,shell=False,\
stdin=subprocess.PIPE,stdout=subprocess.PIPE)

它在文档中被提到了十几次

Try
os.linesep

import os
from subprocess import Popen, PIPE

p = Popen(args, stdin=PIPE, stdout=PIPE)
output = p.communicate(os.linesep.join(['the first input', 'the 2nd']))[0]
rc = p.returncode
在Python 3.4+中,您可以使用:

注意:子脚本可能直接从终端请求密码,而不使用子进程的stdin/stdout。在这种情况下,您可能需要
pexpect
pty
模块。看


谢谢你的解释。我会把我的问题说得更清楚一点。我有一个python脚本,它运行一个命令,该命令会提示我两次:抑制节点:?[y/N]:然后输入schen password:我想在从子流程模块运行脚本时,从脚本自动响应这些提示。可能吗?我只能用communicate()传递第一个答案“y”…如何传递第二个答案?如果您将communicate('y/r/npassword')更改为communicate('y\npassword'),或者甚至可能是communicate('y\r\npassword')(在Windows下),它应该可以立即工作。如果您提供您收到的错误消息(如果有),这将非常有帮助。My script2.py完全具备您想要为脚本提供的功能,并且在我的机器上(linux、python 2.7.5+)运行良好。它仍然会在第二次提示时停止。这是我的代码:它有两个提示:抑制节点:?[y/N]:然后输入schen密码:。它会自动接受“y”,但会提示输入密码(密码是test123,我在脚本中硬编码了它),那么程序似乎不会从stdin获取密码,因此在这里使用subprocess将不起作用。这就是我在回答中提到的问题。解决方案是使用模块pexpect。看看这篇文章,问题和你的很相似:这里可以找到对pexpect的简要介绍:不,同样的事情。它在第一次提示时接受“y”,但在密码处停止。代码@user3431143:然后将代码放在哪里。同样,“同一件事”也不能提供信息。详细描述发生的情况(在您的问题中)。sript要求我自动提供两个提示:抑制节点:?[y/N]:然后输入schen密码:。在第一次提示时,它会自动接受“y”,但会提示输入密码(密码是test123,我在脚本中硬编码的)@user3431143:不要在注释中输入相关信息@user3431143:您在终端上看到密码提示了吗?还是它是空白的?