【问题标题】:Killing a program in Python在 Python 中杀死一个程序
【发布时间】:2017-03-11 20:02:44
【问题描述】:

我有一个循环,我在其中运行已安装的程序,使用 os.system("program + arguments") 将循环中的每个元素作为参数传递给程序。程序的运行时间根据参数而变化,有时需要一秒钟,有时需要几个小时。所以我想在程序花费一个多小时的时候终止程序,然后继续循环中的下一个元素。

我在这里尝试使用第二个答案(因为我无法理解如何使用最佳答案)Python: Run a process and kill it if it doesn't end within one houros.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

最好的问候!

【问题讨论】:

  • 您可以尝试在不同的线程中生成它,然后终止该线程。
  • 显示您尝试执行的命令行。 program+arguments 基本上没用。您正在正确调用 popen,但是您传入的任何内容都是错误的,因此“没有这样的文件或目录”。
  • 如果是在windows下,你可能忘了引用路径,所以.popen("c:\program files\blah blah blah"试图执行一个名为c:\program的程序,参数为files\blah blah blah
  • @MarcB 我检查了两次路径,它们没问题,它在 linux 下
  • “好吧”并不能帮助我们找出问题所在。显示命令。

标签: python process subprocess


【解决方案1】:

你可以设置一个定时器来终止进程

import subprocess
import threading

proc = subprocess.call("program + arguments", shell=True)
timer = threading.Timer(3600, proc.kill)
timer.cancel()
proc.wait()

callcheck_callPopen 调用接受两种形式的程序。应该传递给子shell的单个字符串(“program arg1 arg2”)(您需要shell=True才能使其工作)或参数列表[“program”,“arg1”,“arg2”](@987654327 @ 是可选的,如果您不使用子shell,Linux 上的效率会更高)。您将程序 + args 作为单个项目放入列表中,python 尽职尽责地转义了所有分隔符并尝试运行该全名的程序。

【讨论】:

  • 谢谢,我试试。 Python 文档说,使用 shell=True 可能存在安全隐患,由于我与其他人共享服务器,因此使用此方法是否安全?
  • 至于安全性,它有点像 shell 的 sql injection attack。假设你从一个不受信任的用户那里得到输入,而不是用户名,有人键入";rm -rf /" - shell 看到了分号,启动了一个新命令,你只是把你的服务器炸飞了!修复很简单,您可以为该字段调用shlex.quote。当您使用列表形式时,Python 会做同样的事情。在["prog", ";rm -rf /"] 中,第二个参数被引用并且是安全的。只要您引用用户的任何数据,shell=true 就可以了。
【解决方案2】:

在 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")])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2017-08-05
    • 2018-07-29
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多