首页 > 解决方案 > 如何使用命令行停止python脚本

问题描述

我有 python 脚本,它在后台向/从 FTP 服务器下载/上传文件。

run = 1
while run == 1:    
   get_from_ftp(server, login, password)

我想使用命令行运行和停止我的 python 脚本

像:

myprogram.py startmyprogram.py stop

myprogram.py stop当我运行命令变量时,这个想法run应该得到值 0 并且循环(while)应该上传/下载最后一个文件并停止。

请建议我如何实现它。

请不要建议使用 kill、ps 和 ctrl+c

标签: pythonbackground

解决方案


由于您希望能够通过命令行进行控制,因此一种方法是使用临时“标志”文件,该文件将由 . 创建myprogram.py start并由myprogram.py stop. 关键是,当文件存在时,myprogram.py将继续运行循环。

    import os
    import sys
    import time
    FLAGFILENAME = 'startstop.file'


    def set_file_flag(startorstop):
        # In this case I am using a simple file, but the flag could be
        # anything else: an entry in a database, a specific time...
        if startorstop:
            with open(FLAGFILENAME, "w") as f:
                f.write('run')
        else:
            if os.path.isfile(FLAGFILENAME):
                os.unlink(FLAGFILENAME)


    def is_flag_set():
        return os.path.isfile(FLAGFILENAME)


    def get_from_ftp(server, login, password):
        print("Still running...")
        time.sleep(1)


    def main():
        if len(sys.argv) < 2:
            print "Usage: <program> start|stop"
            sys.exit()

        start_stop = sys.argv[1]
        if start_stop == 'start':
            print "Starting"
            set_file_flag(True)

        if start_stop == 'stop':
            print "Stopping"
            set_file_flag(False)

        server, login, password = 'a', 'b', 'c'

        while is_flag_set():
            get_from_ftp(server, login, password)
        print "Stopped"


    if __name__ == '__main__':
        main()

可以想象,旗帜可以是其他任何东西。这非常简单,如果您想运行两个以上的实例,那么您至少应该为每个实例命名不同的文件(例如,使用 CLI 参数),以便您可以有选择地停止每个实例。

不过,我确实喜欢@cdarke 提出的关于拦截和处理 CTRL+C 的想法,并且该机制与我的方法非常相似,并且适用于单个实例。


推荐阅读