我有一个循环,我在其中运行已安装的程序
os.system("program + arguments")
将循环中的每个元素作为参数传递给程序。程序的运行时根据参数而变化,有时需要一秒钟,有时需要几个小时。所以我想在花费一个多小时的时间内杀死程序并继续循环中的下一个元素。
我尝试使用第二个答案(因为我无法理解如何使用最佳答案)Python: Run a process and kill it if it doesn't end within one hour将os.sytem("program+arguments")
替换为subprocess.Popen(["program+arguments"])
但它提供"No such file or directory error"
,我确定我正确地传递了论据,你能帮助我如何应用这样的解决方案吗?
以下是错误消息
subp = subprocess.Popen(["home/admin/Desktop/molblocks/fragment -i " + OrgDir+"/"+compsmi + " -r "+ RulesPath + " -e -n "+str(FragLength) + " -o " + compsmi + "_frag.txt"])
File "/usr/lib64/python2.7/subprocess.py", line 709, in __init__
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1326, in _execute_child
raise child_exception
最诚挚的问候!
答案 0 :(得分:1)
在Unix上,如果args是一个字符串,则该字符串被解释为要执行的程序的名称或路径。但是,只有在不将参数传递给程序时才能执行此操作。 (当shell不为True时)
https://docs.python.org/2/library/subprocess.html#subprocess.Popen
试试这个:
subp = subprocess.Popen(["home/admin/Desktop/molblocks/fragment", "-i", (OrgDir+"/"+compsmi), "-r", RulesPath, "-e", "-n", str(FragLength), "-o", (compsmi+"_frag.txt")])
答案 1 :(得分:0)
你可以设置一个计时器来杀死这个过程
import subprocess
import threading
proc = subprocess.call("program + arguments", shell=True)
timer = threading.Timer(3600, proc.kill)
timer.cancel()
proc.wait()
call
,check_call
和Popen
来电以两种形式接受节目。应该传递给子shell的单个字符串(“program arg1 arg2”)(需要shell=True
才能使其工作)或参数列表[“program”,“arg1”,“arg2”]( shell=True
是可选的,如果你不使用子shell,在Linux上更有效率。你把程序+ args作为单个项目放在一个列表中,python尽职尽责地转义所有的分隔符,并试图运行一个全名的程序。