停止在另一个 Python 脚本中运行的一个 Python 脚本

Posted

技术标签:

【中文标题】停止在另一个 Python 脚本中运行的一个 Python 脚本【英文标题】:Stop one Python script that is running within another 【发布时间】:2019-02-14 11:52:28 【问题描述】:

我有一个从主脚本启动的 Python 应用程序,比如说main.pymain.py(因为我的应用程序是有组织的)引用并导入同一目录中的其他 .py 文件,这些文件包含其他功能。当我的应用程序持续运行时,它会从另一个脚本中导入这样的函数,该脚本也应该永远运行,直到它被明确取消。

问题是,我将如何取消 那个 特定脚本,同时保持其受影响的变量不变并且主脚本/更大的应用程序仍在运行?

我不知道如何针对特定功能停止执行。

【问题讨论】:

如果我正确理解这一点,您可以在该脚本中拥有一个自定义异常类,当调用该异常类时,该类将停止该脚本运行,但不会影响主循环。如果这听起来像你正在寻找的东西,我会发布一个例子 你可以杀死你的进程(不好但容易)。 通过这个:- docs.python.org/3/library/asyncio.html 当我阅读 gautamaggarwal 的建议时,通过从另一个函数调用的一些自定义异常来停止我想要的特定函数确实是理想的。我将不胜感激这样的例子。 【参考方案1】:

我在我的 utils 中使用了一个 kill 函数来杀死任何我知道名字的不需要的 python 进程。请注意,以下代码已在 Ubuntu Linux 和 Mac OS 机器上测试/运行。

def get_running_pids(process_name):
    pids = []
    p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
    out, err = p.communicate()
    for line in out.splitlines():
        if process_name in line.decode('utf-8'):
            pid = int(line.decode('utf-8').split(None, 1)[0])
            pids.append(pid)
    return pids

def kill_process_with_name(process_name):
        pids = get_running_pids(process_name)
        for pid in pids:
            os.kill(pid, signal.SIGKILL)

【讨论】:

对于process_name,这是持续运行的函数名,还是别的什么? 我通常在与控制脚本不同的进程中启动我想杀死的脚本。【参考方案2】:

您可以设置用户定义、自定义、例外。扩展 Python 内置的异常对象。进一步阅读:Pythons User Defined Exceptions

CustomExceptions.py:

class HaltException(Exception):
    pass

-

main.py:

from CustomExceptions import HaltException

class Functions():

    def a(self):
       print("hey")
       self.b()
       return "1"
def b(self):
    print("hello")
    raise HaltException()

def main():

    func_obj = Functions()

    try: 
        func_obj.a()
    except HaltException as e:
        pass
    print("Awesome")

main()

程序可以通过创建新异常来命名自己的异常 类(有关 Python 类的更多信息,请参见类)。例外应该 通常从 Exception 类派生,直接或 间接的。

【讨论】:

这似乎是我想要做的,能够在标准 Python 中取消脚本,但这个答案的逻辑让我有点困惑。这是如何工作的? 嘿,在此处查看有关用户定义异常的文档:docs.python.org/3/tutorial/errors.html#user-defined-exceptions 可能比我更好地解释它

以上是关于停止在另一个 Python 脚本中运行的一个 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个脚本中运行 Python 脚本并立即关闭自身

使用命令行参数在另一个 Python 脚本中调用一个 Python 脚本

如何在python中停止另一个已经运行的脚本?

如何捕获从 MYSQL 触发器(嵌入在另一个 py 脚本中)内部调用的 python 脚本的输出?

从命令行停止 Abaqus 中正在运行的 Python 脚本

模块使用