Как остановить скрипт Python с помощью командной строки - PullRequest
0 голосов
/ 05 октября 2018

У меня есть скрипт Python, который загружает / выгружает файлы на / с FTP-сервера в фоновом режиме.

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

Я хочу запустить и остановить свой скрипт Python с помощью командной строки

Как:

myprogram.py start и myprogram.py stop

Идея заключается в следующем, когда я запускаю команду myprogram.py stop переменная run должна получить значение 0, а цикл (while) должен загрузить / загрузить последний файли остановитесь.

Пожалуйста, предложите, как я могу это реализовать.

Пожалуйста, не предлагайте использовать kill, ps и ctrl + c

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Вы можете использовать ниже -

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 start и python myprogram.py stop.

0 голосов
/ 05 октября 2018

Поскольку вы хотите иметь возможность управлять через командную строку, один из способов сделать это - использовать временный файл «flag», который будет создан 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, хотя механизм очень похож на мой подход и хорошо работает с одним экземпляром.

0 голосов
/ 05 октября 2018
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

Если я понимаю, ваш вопрос может быть что-то в этом роде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...