Продолжайте запускать python, даже если код выхода

#python #python-2.7 #exit-code

Вопрос:

Я вызываю внешнюю программу из python 2.7, и в качестве входных данных для этой программы у меня есть несколько параметров. У меня нет доступа к коду программы, которую я вызываю. Для некоторых комбинаций этих параметров программа завершает работу и возвращает код выхода без ошибок; обычно «Процесс завершен с кодом выхода -1073741819 (0xC0000005)». Что я хочу сделать, так это: всякий раз, когда он завершается с этим кодом выхода, я хочу, чтобы он перезапускал сценарий с новыми начальными параметрами. Я попробовал кое-что вместе:

 parameters1 = [1, 2, 3, 4]
parameters2 = [2, 3, 4, 5]
j = 0
q = 0
while j == 0:
    parameter1 = parameters1[q]
    parameter2 = parameters2[q]
    try:
        f3d.run(parameter1 = parameter1, parameter2 = parameter2)
        j = 1
    except:
        pass
 

Комментарии:

1. Неясно, где вы запускаете внешнюю программу. f3d.run по-прежнему является вызовом функции Python.

2. Вы также должны включить (полную) ошибку в свой вопрос.

3. try except: pass как правило, это действительно плохо: он игнорирует каждую ошибку и не обрабатывает их. Ошибки на самом деле-это хорошо, но с помощью попытки, кроме: блока передачи, вы превращаете их в ошибки (ваша программа/данные выходят из строя, но никто об этом не узнает).

4. Есть ряд вопросов, связанных с этим сообщением об ошибке (их легко найти); все они, по-видимому, связаны с PyCharm, и иногда повторная установка поможет. Вы используете PyCharm?

5. «Я попробовал кое-что вместе:» Хорошо, и что произошло , когда ты попытался это сделать? Что должно произойти вместо этого, и чем это отличается?

Ответ №1:

Хотя вопрос совершенно неясен, я думаю, что это то, чего вы пытаетесь достичь:

runner.py:

 SLEEP_TIME = 3
print('Starting run...')

while True:

    exit_code = subprocess.call(['python', 'foo.py', parameter_1, parameter_2])
    print('Script Stopped.')

    if exit_code == -1073741819:
        # change parameter_1 and parameter_2 here

    print('Sleeping for %d seconds' % SLEEP_TIME)
    time.sleep(SLEEP_TIME)
    print('Restarting...')
 

фу.py:

 import sys
parameter_1 = sys.argv[1]
parameter_2 = sys.argv[2]

# Your code here
 

Вы запускаете runner.py программу, которая будет перезапускаться бесконечно.

Кроме того, нежелательный совет: Не используйте Python2.7. Это устарело.

Ответ №2:

Большое спасибо за быстрый и хороший ответ! Это то, что я искал. Мне пришлось использовать Python2.7, чтобы быть совместимым с внешним программным обеспечением. Хорошего дня, мой добрый сэр/мадам!

Комментарии:

1. Пожалуйста, добавьте дополнительные сведения, чтобы расширить свой ответ, например, ссылки на рабочий код или документацию.