如何以编程方式在终端命令上写入预期的输入?

时间:2019-09-06 21:40:48

标签: python subprocess aws-cli

我正在尝试使用python 2.7以编程方式执行此命令:

# prepare the data as a dataframe with boolean values
import pandas as pd

df = pd.DataFrame (
    [
        [True,True, True],
        [True, False,False],
        [True, True, True],
        [True, False, False],
        [True, True, True],
        [True, False, True],
        [True, True, True],
        [False, False, True],
        [False, True, True],
        [True, False, True],
    ],
    columns=list ('ABC')) 

# set up rpy2
from rpy2.robjects import pandas2ri
pandas2ri.activate()
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
arules = importr("arules")

# run apriori
itsets = arules.apriori(df, 
   parameter = ro.ListVector({"supp": 0.1, "target": "frequent itemsets"}))

# get itemsets as a dataframe
print(arules.DATAFRAME(itsets))

# get quality as a dataframe
print(itsets.slots["quality"])

# get itemsets as a matrix
itemset_as_matrix = ro.r('function(x) as(items(x), "matrix")')
itemset_as_matrix(itsets)

问题是this command一经执行,就会要求用户输入一些参数:

aws configure --profile name_profile

我知道如何在python中执行命令,通常只需完成以下几行:

$ aws configure
AWS Access Key ID [****]: access_key_input
AWS Secret Access Key [****]: secret__key_input
Default region name [us-west-1]: region_optional_input

但是在这种情况下,我不知道如何模拟此过程。我想写类似的东西

def execute_command(command):
    try:
        process = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        output, error = process.communicate()
        return output, error
    except Exception as error:
        return None, error

这应该执行before命令,并使用参数回答问题。

先谢谢大家。

2 个答案:

答案 0 :(得分:1)

这个问题与AWS CLI的关系比与Python有关的问题更多。配置AWS credentials的简单,非交互方式是使用AWS shared credentials file

您可以使函数创建这样的共享凭据文件,而不必与命令行进行交互,并确保在完成操作后还清理或删除该文件。

如果您坚持使用Python与AWS CLI交互,则有两种方法。通过快速的Google搜索,我发现了this SO post。根据我自己使用Python编程与命令行交互的经验,我使用过Pexpect。该库基本上可以让您期望某些文本会出现在CLI中,然后您的程序可以将新数据输出到CLI。

答案 1 :(得分:1)

即使使用Pexpect(感谢@ natn2323)解决了问题,我仍然发现,如果您不需要检查动态问题,并且问题的数量和类型始终相同。这也将起作用:

try:
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    output, error = process.communicate(input=b"answer1\nanswer2\n\n")
    return output, error
except Exception as error:
    return None, error

请注意,对于我的情况(aws配置),最后两个答案(输入“ \ n \ n”的最后部分)为空。

我在Pycharm和使用Pexpect方面存在一些错误,因此最后我将使用此解决方案。