如何使用命令行停止python脚本

时间:2018-10-05 12:11:03

标签: python background

我有python脚本,可在后台从FTP服务器下载文件/从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

3 个答案:

答案 0 :(得分:0)

while True: 
   run= int(input("press 1 to run/ 0 to stop: "))
   if run == 1:   
        get_from_ftp(server, login, password)
   elif run ==0:
        # what you want to do

如果我理解您的问题可能就是这样

答案 1 :(得分:0)

您可以在下面使用-

import sys
import os

text_file = open('Output.txt', 'w')
text_file.write(sys.argv[1])
text_file.close()

if sys.argv[1] == "stop":
    sys.exit(0)

run = 1
while run == 1:

#   Your code   

    fw = open('Output.txt', 'r')
    linesw = fw.read().replace('\n', '')
    fw.close()
    if linesw == "stop":
        os.remove('Output.txt')
        break
sys.exit(0)

我正在使用Python 3.7.0。 像python myprogram.py startpython myprogram.py stop一样运行它。

答案 2 :(得分:0)

由于您希望能够通过命令行进行控制,因此,一种方法是使用临时的“标志”文件,该文件将由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的想法,并且该机制与我的方法非常相似,并且可以在单个实例上很好地工作。