将控制台输出导出到.txt不起作用

时间:2014-08-19 05:51:52

标签: python bash subprocess

我正在尝试将控制台输出从Script1.py保存到.txt文件。 但是,我需要为几个参数运行此脚本,例如“python Script1.py 43131”,其中“43131”是参数,参数存储在列表中(Runnummer)。 我现在尝试做的是使用典型的bash导出执行另一个脚本“WrapperScript1.py”来为我做这些事情:

from subprocess import call
for i in range(len(Runnummer)):    
    call(["python Script1.py " + Runnummer[i] + 
          ' > ' + './test/Run' + Runnummer[i] +'.txt'])

此代码现在应该执行“python Script1.py arg(i)> ./test/runarg(i).txt”。 我已经在控制台中手动为一个我尝试了它并且它可以工作,但是如果我使用子进程并循环它,它会以某种方式工作。 发生的情况是代码正常运行,但没有控制台输出保存到.txt。

我读到你也可以在子进程中使用PIPE,但我并没有真正得到如何使用它,所以我尝试了如上所述。我也尝试过os.system,但它也没有用。

提前致谢!

5 个答案:

答案 0 :(得分:2)

假设您事先知道要运行循环的次数,可以使用shell而不是从另一个调用一个python脚本:

for i in {0..100}; do python Script1.py $i > test/Run$i.txt; done

如上所述in the comments(感谢@tripleee),{0..100}范围是Bash功能,所以这不会在所有shell中都有效。如果你的shell不支持大括号扩展,你可以使用seq工具for i in $(seq 0 100),或者失败,while循环:

i=0
while [ $i -le 100 ]; do
    python Script1.py $i > test/Run$i.txt
    i=$((i+1)) # POSIX compliant (thanks @chepner)
    # or, for a more vintage experience
    # i=$(expr $i + 1)
done

答案 1 :(得分:2)

重定向是一个shell功能。如果要使用它,shell参数需要设置为True

此外,您正在混合两个调用约定。传递单个字符串以便shell解析,或者将解析后的标记列表作为字符串传递。

from subprocess import call
for i in range(len(Runnummer)):    
    call("python Script1.py " + Runnummer[i] + 
      ' > ' + './test/Run' + Runnummer[i] +'.txt', shell=True)

由于您无论如何都要调用shell,因此在shell脚本中执行此操作可能更有意义,如Tom's answer中已建议的那样。

答案 2 :(得分:0)

第一件事是call期望一组参数

第二件事是call不要重定向为shell,因此您无法使用>

对于子流程的收集输出,更简单的是使用check_output而不是

from subprocess import check_output
Runnummer=["a","b"]
for i in range(len(Runnummer)):    
    with open('./test/Run' + Runnummer[i] +'.txt',"w") as output:
        output.write(check_output(["python","Script1.py",str(Runnummer[i])]))
从pythonic样式点

不需要95%的时间range,只需直接在列表上迭代。所以:

from subprocess import check_output
Runnummer=["c","d"]
for run in Runnummer:    
    with open('./test/Run' + run +'.txt',"wb") as output:
        output.write(check_output(["python","Script1.py",run]))

答案 3 :(得分:0)

您可以使用os.system代替subprocess

import os
for i in range(len(Runnummer)):
    os.system('python Script1.py ' + Runnummer[i] + 
              ' > ' + './test/Run' + Runnummer[i] +'.txt')

答案 4 :(得分:0)

不是在shell中使用I / O重定向,而是打开一个文件以便用Python编写,并使用stdout参数将文件句柄传递给call

from subprocess import call
for f in Runnummer:
    output_file = "./test/Run{0}.txt".format(f)
    with open(output_file, "w") as fh:
        call(["python", "Script1.py", f], stdout=fh)

此外,直接在列表上进行迭代而不是在整数列表上进行迭代以用作列表索引更清晰。