Как я могу остановить свой скрипт python при запуске другого скрипта python?

Я хочу знать, как я могу остановить текущий скрипт python, когда он уже запущен.

Чтобы быть ясным, я хочу написать его в моем собственном скрипте python. Итак, самое главное, в основном методе, он проверяет, запущен ли мой скрипт python или нет. Если он запущен, я хочу выйти с сообщением об ошибке.

В настоящее время я пытаюсь использовать этот код:

if os.system("ps ax | grep sample_python.py") == True: print "fail" exit(0) else: print "pass" 

Вышеприведенный код выглядит как grepping имя python .. но он всегда переходит в else loop вместо перехода в цикл if и выхода.

Поэтому для тестирования я запускаю свой скрипт, а на другом терминале снова запускаю свой сценарий. Первый скрипт не останавливается, но 2-й питон не входит в цикл if для вывода сообщения об ошибке.

Как я могу это исправить?


Хорошо, я нашел тупую вещь, и я хочу посмотреть, может ли кто-нибудь помочь мне обойти это. Поэтому я решил убить питон, который только что запущен, если в данный момент запущен другой python. Но тупое дело … так как я я запускаю свой python и запускаю проверку кода внутри этого python .. он всегда выйдет .. потому что как только я запустим Python, PID будет создан и будет запущен …

Итак, запуск python -> pid создан и запущен -> проверить, запущен ли python -> yes python запущен -> выйти.

Я хочу посмотреть, есть ли способ запуска python -> проверить, запущен ли python или нет -> если он запущен, убить текущий python, а не тот, который был запущен.

5 Solutions collect form web for “Как я могу остановить свой скрипт python при запуске другого скрипта python?”

Файл блокировки с PID текущего процесса является более систематическим способом для этого. Программа просто проверяет в начале, существует ли файл PID и заблокирован ( flock или lockf ); если это так, это означает, что еще один экземпляр этой программы все еще запущен. Если нет, он создает (или переписывает) файл PID и блокирует его.

Блокировка flock / lockf имеет то преимущество, что операционная система автоматически удаляет блокировку в случае завершения программы.

См. Здесь, как это сделать в Python:

Python: модуль для создания файла блокировки на основе PID?

Более питонический путь:

 import os import psutil script_name = os.path.basename(__file__) if script_name in [p.name() for p in psutil.get_process_list()]: print "Running" 

Вместо использования grep , почему бы не создать файл блокировки? Один экземпляр вашей программы создает файл в известном месте и удаляет его при выходе. Любой другой экземпляр должен проверить наличие этого файла и продолжать работать только в том случае, если он уже существует.

Функция os.open() имеет определенные флаги для этого:

 import os LOCKFILE_LOCATION = "/path/to/lockfile" try: os.open(LOCKFILE_LOCATION, os.O_CREAT|os.O_WRONLY|os.O_EXCL) # Maybe even write the script's PID to this file, just in case you need # to check whether the program died unexpectedly. except OSError: # File exists or could not be created. Can check errno if you really # need to know, but this may be OS dependent. print("Failed to create lockfile. Is another instance already running?") exit(1) else: print("Pass") # Run the rest of the program. # Delete the file os.remove(LOCKFILE_LOCATION) 

Попробуйте это, поставив, скажем, import time; time.sleep(20) import time; time.sleep(20) после `print (« Pass ») и запуска нескольких экземпляров этого скрипта; все, кроме одного, должны потерпеть неудачу.

Команда os.system () возвращает значение завершения команды, которая была запущена. Если ps был успешным, он возвращает 0, что не эквивалентно True. Вы можете явно проверить, вернула ли команда нуль, которая должна привести вас в блок if.

Изменить: для этого требуется os.subprocess . Эти четыре команды должны получить то, что вы хотите.

 p1 = subprocess.Popen(['ps', 'ax'], stdout=subprocess.PIPE) p2 = subprocess.Popen(['grep', 'bash'], stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(['wc', '-l'], stdin=p2.stdout, stdout=subprocess.PIPE) count = int(p3.stdout.read()) if count > 1: print('yes') 

Замените «bash» на имя вашего скрипта. Что это такое – получить список запущенных процессов, каналы, которые выводят в grep, чтобы вывести все, кроме вашего скрипта (или экземпляры bash в образце кода), каналы, которые выводят в wc, чтобы получить количество строк, а затем запрашивают этот процесс для его stdout, который является счетчиком экземпляров сценария, который в настоящее время запущен. Затем вы можете использовать эту переменную count в выражении if, где, если работает более одного экземпляра, вы можете прервать выполнение.

Потому что os.system ("ps ax | grep sample_python.py") возвращает 0. Это неверно.

Посмотрите на этот вопрос: присвойте выходной сигнал os.system переменной и не позволяйте ей отображаться на экране

Вы должны написать

 os.popen('cat /etc/services').read() 

Но таким образом вы всегда будете идти к «неудачному», потому что ваш скрипт уже начался. Вы должны подсчитать количество возвращенных строк …

Посмотрите здесь как вариант одного экземпляра:

Python: один экземпляр программы

Я написал такой скрипт. Я создал файл с любым именем в начале и удалил в конце. Это был сценарий демона. В начале я проверил, существует ли этот файл.

Неплохой вариант здесь. Обеспечьте один экземпляр приложения в Linux :

 import fcntl pid_file = 'program.pid' fp = open(pid_file, 'w') try: fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: # another instance is running sys.exit(1) 
  • Как найти идентификатор пользователя по имени пользователя (Python под * NIX)
  • Адресация ошибки sys.excepthook в сценарии bash
  • Как разбить огромный файл csv на основе содержимого первого столбца?
  • Как получить путь к системной библиотеке в Unix (Linux, FreeBSD)
  • Эквивалент команды Python3 Pass в Ruby
  • Как отправить EOF на Python sys.stdin из командной строки? CTRL-D не работает
  • Изменение даты и времени на отметку времени Unix в Python
  • Обозначения Unix filename в Python?
  • Python - лучший язык программирования в мире.