【问题标题】:Check if a Python script is already running in Windows检查 Python 脚本是否已在 Windows 中运行
【发布时间】:2017-01-02 22:04:30
【问题描述】:

为什么要检查特定 Python 脚本是否已在 Windows 中运行,最好/最简单的方法是什么?

我有一个脚本可以遍历文件夹中的所有文件并将它们复制到另一个文件夹(排序到电影或电视节目文件夹)。 我想确保当脚本启动时没有另一个进程(同一个脚本的)已经在运行,所以我不会遇到尝试移动相同文件的 2 个脚本的问题。

我尝试在脚本的开头创建一个文件并在脚本完成时将其删除,但是当脚本崩溃和/或引发错误时我遇到了问题。

我知道我可以使用psutil,但随后我将获得进程名称 (python.exe),我正在寻找区分 Python 进程是在运行我的脚本还是其他程序的原因。

【问题讨论】:

  • 将所有顶级执行语句打包在一个(顶级)函数中,从try...except 语句中调用它并删除@ 中的“锁定”文件987654324@ 部分(如果存在)。

标签: python windows process


【解决方案1】:

您可以使用psutil.Process().cmdline() 查看进程的完整命令行。

或者,您可以锁定正在处理的文件。请参阅this question 的答案如何在 ms-windows 上执行此操作。锁的问题是您必须小心删除它们,尤其是在发生错误时。

【讨论】:

    【解决方案2】:

    使用lockfile。它是跨平台的,使用本机操作系统功能,并且比任何 home-brewn 锁定文件创建模式更强大

    【讨论】:

      【解决方案3】:

      我已经通过使用一个空的虚拟文件解决了这个问题。 在进程开始时我检查文件是否存在,如果不存在,则创建一个新文件,运行该进程并最终将其删除(即使进程失败),如果文件确实存在,则表示该进程是现在正在运行,所以我终止当前(新)进程。

      【讨论】:

        【解决方案4】:

        对于 Windows 操作系统你可以使用 timestamp.txt 文件

        timestamp = 'timestamp.txt'
        ...
        elif windows:
            try:
                new_timestamp = False
                if not os.path.exists(timestamp):
                    new_timestamp = True
                    try:
                        with open(timestamp, 'a') as f_timestamp:
                            f_timestamp.write(str(int_t0))
                    except IOError as e:
                        out1 = 'M. Cannot open file for writing. Error: %s - %s.' \
                                   % (e.logfile, e.strerror) + ' -> Exit code 3'
                        logging.error(out1)
                        sys.exit(3)
        
                if not new_timestamp and os.path.exists(timestamp):
                    out1 = 'N. Script ' + __file__ + ' is already running.'
                    print(out1)
                    logging.error(out1)
                    sys.exit(0)
        
            except IOError as e:
                out1 = 'J. Cannot open file. Error: %s - %s.' \
                   % (e.filepath, e.strerror)  + ' -> Exit code 4'
                logging.error(out1)
        
        ...
        try:
            f_timestamp.close()
            os.remove(timestamp)
        except OSError as e:
            logging.error('B. Cannot delete ' + timestamp + \
                  ' Error: %s - %s.' % (e.filename, e.strerror))
        

        【讨论】:

        • 有点矫枉过正,我通过创建一个文件并在finally部分中删除它来解决它。
        猜你喜欢
        • 1970-01-01
        • 2017-10-05
        • 2019-03-10
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2020-09-23
        相关资源
        最近更新 更多