我正在尝试使用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代码之外)时,它工作正常。我使用语法不正确吗?
答案 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)
希望这适合你!