使用subprocess.communicate()调用外部脚本并自动化用户输入

时间:2015-10-12 22:57:37

标签: python shell

我是编程新手,并且在一周的大部分时间里一直在努力解决这个问题。

我需要编写一个循环遍历目录中每个文件的程序,使用环境文件调用基于Perl脚本的外部命令行来对该文件中的数据执行计算,自动分配用户输入,然后捕获输出。我认为像PyAutoGUI这样的东西足以控制用户输入的命令行,但显然它不能像那样工作。无论如何,没有什么工作,我找不到任何帮助我的具体问题。这是我最好的镜头:

os.path.join("Files_for_calculations")
    for files in os.listdir("Files_for_calculations"):
    for file in files:
        in_file = str(file)
        print "Executing calculations on " + str(file) + " ..."
        in_file = str(files)
        args = ["1", "%s" % in_file, "5", "4", "-1.6", "8", "alloy-liquid", "0", "4", "0"] #these are supposed to be the user inputs
        subprocess.command(["perl", "run_commands.comand -f a", args], stdout=PIPE, stdin=PIPE, shell=True)

1 个答案:

答案 0 :(得分:0)

这里有很多问题。

os.path.join("Files_for_calculations")

此行无效。 os.path.join用于将文件路径的各个部分拼接在一起。因为你只给出了一条路径,所以没有任何东西可以拼接。即使有,所有这个功能都是构造并返回路径。它不会更改工作目录。我不确定你想做什么,但这不是它。

for files in os.listdir("Files_for_calculations"):
    for file in files:

(缩进更正。)您不需要两个循环。 os.listdir将返回文件名列表。如果这些是目录,则需要再次对它们调用os.listdir。如果他们只是文件,我怀疑,那么第二个循环将为您提供名称中所有字母的列表。

我想你可能意味着

for infile in os.listdir("Files_for_calculations"):

你根本不需要第二个循环。我将“文件”更改为“infile”,因为在python 2中,file是内置类型,您不应该覆盖它。

该行

in_file = str(file)

没有意义,因为文件已经是一个字符串。同样,在args的定义中,您不需要"%s" % in_file,因为in_file已经是一个字符串。这不是错误,但它使代码更难阅读。只需使用in_file即可。

我不知道perl,所以我不能对subrocess.command的调用说些什么。