子进程函数python:在自动化中使用

时间:2017-09-05 08:15:53

标签: python python-2.7 subprocess

我正在尝试使用Python在终端中运行此命令:

  

./ Pascal --set = settings / 1_settings.txt --runpathway = on   --genescoring = sum --pval = 1_snp_values.txt.gz

我需要每次使用不同的pval运行此脚本180次。因此,通过Python自动化它可以节省我很多时间。

目前我有一个像这样的Python子流程:

  

subprocess.call(“./ Pascal --set = settings / 1_settings.txt   --runpathway = on --genescoring = sum --pval = 1_snp_values.txt.gz“)

虽然,我收到了这个错误:

Traceback (most recent call last):
  File "test_automation.py", line 4, in <module>
    subprocess.call("./Pascal --set=settings/1_settings.txt --runpathway=on --genescoring=sum --pval=1_snp_values.txt.gz")
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception

问题是当我在终端中执行完全相同的命令(在Python代码之外)时,它工作正常。我使用语法不正确吗?

1 个答案:

答案 0 :(得分:0)

使用os.system ...

您可以尝试使用它来运行终端命令,如下所示:

import os
os.system("./Pascal --set=settings/1_settings.txt --runpathway=on --genescoring=sum --pval=1_snp_values.txt.gz")

如果这样做,可以在for-loop中执行以使其运行180次很简单:

import os
for _ in range(180):
    os.system("./Pascal --set=settings/1_settings.txt --runpathway=on --genescoring=sum --pval=1_snp_values.txt.gz")

此外,如果Pascal与您运行脚本的目录相同,则不需要路径./,因为默认情况下,它将搜索当前工作目录。因此,您可以将其更改为Pascal --set-settings...

使用subprocess.call ...

就我个人而言,我认为使用os.system是一个更清晰的解决方案,但您可以使用subprocess.call以两种方式之一执行相同的操作:

Pascal分开调用list和其他参数,如:

import subprocess as s
s.call(['./Pascal', '--set=settings/1_settings.txt', '--runpathway=on', '--genescoring=sum', '--pval=1_snp_values.txt.gz'])

或者只需将shell设置为true,然后将整行作为字符串传递给:

import subprocess as s
s.call('./Pascal --set=settings/1_settings.txt --runpathway=on --genescoring=sum --pval=1_snp_values.txt.gz', shell=True)

希望这适合你!