2016-01-03 5 views
0

Я не уверен, почему мой код не работает. Я пытаюсь перезапустить приложение python. Heres функция для перезапуска:Перезагрузите мою программу в Python

def restart_program(): 
    try: 
     p = psutil.Process(os.getpid()) 
     for handler in p.get_open_files() + p.connections(): 
      os.close(handler.fd) 
    except Exception as e: 
     logging.error(e) 

    python = sys.executable 
    os.execl(python, python, *sys.argv) 

тогда я призвал к ней внутри, если заявление, как это:

if cycles >= CLEANCYCLES: 
     print('Cleaning database and re-logging...') 
     cur.execute('DELETE FROM oldposts WHERE id NOT IN (SELECT id FROM oldposts ORDER BY id DESC LIMIT ?)', [MAXPOSTS * 2]) 
     sql.commit() 
     cycles = 0 
     restart_program() 

Я побежал из CMD в питона, чтобы увидеть ошибку, и это то, что он говорит: T

raceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
     File "c:\Users\suffICE\Desktop\redditBot\working version\csgoNAbot.py", line 91 
     restart_program() 
         ^
    TabError: inconsistent use of tabs and spaces in indentation 

Что мне делать, чтобы исправить это? Когда я удаляю вызов для sub, он отлично работает ...

+5

Я не знаю, t думаю, что сообщение об ошибке может быть более явным. Вам нужно проверить свой отступ, и рекомендуется использовать только пространство, а не смешивать их с вкладками. –

+0

Вот что это было! Я использовал пространство вместо вкладки, чтобы написать его, и это сработало ... какая простая и идиотская ошибка. Надеюсь, что люди могут найти это полезное, подумал. Я мог бы реализовать другой метод его перезапуска. –

ответ

4

Отпечаток неправильный. Эта ошибка не имеет ничего общего с перезапуском. Просто исправьте его, чтобы использовать согласованные пробелы.

+0

Где мои углубления/пробелы неправильно ...? –

+0

Нашел его, спасибо :) –

4

Вы вытаскиваете вилку из стены и ожидаете ее продолжения работы. Это определенно не сработает.

Одна вещь, которую вы можете попробовать, - иметь родительский процесс, запускающий ваше приложение. Этот родительский процесс будет прослушивать код выхода, возвращенный из вашего приложения, и предпринять соответствующие действия. Например, если ваше приложение выходит с кодом 10, родительский процесс просто перезапустит ваше приложение.

очень упрощенный пример:

import os, sys 

def my_app(): 
    # your existing code here 
    # ... 

    sys.exit(10) # exit child process with return code 10 

do_fork = True 
while do_fork: 
    child_pid = os.fork() 
    if child_pid == 0: 
     # inside child process 
     my_app() 

    pid, status = os.waitpid(child_pid, 0) 
    do_fork = (status == 10) 

Это может быть трудно обернуть вокруг головы, но на os.fork линии, ваш код разделяется на два процесса. Один из процессов становится родителем (когда child_pid != 0), и один становится дочерним (child_pid == 0). На данный момент эти два процесса используют различные пути (один работает my_app функцию, и один работает os.waitpid для ребенка, чтобы закончить)

+0

Мне нужно иметь возможность вызвать его в выражении if. Я не понимаю ... Я хочу, чтобы код перезапустил его, чтобы войти в оператор if. –

+0

Вы будете делать 'sys.exit (10)' из своей функции 'restart_program()'. Однако важно начать свой код с примера, приведенного в ответе. –

0

Вы можете использовать эту функцию, которая будет делать то, что вы хотите:

import sys 
import os 
def restart_program(): 
    """Restarts the current program. 
    Note: this function does not return. Any cleanup action (like 
    saving data) must be done before calling this function.""" 
    python = sys.executable 
    os.execl(python, python, * sys.argv) 
if __name__ == "__main__": 
    answer = raw_input("Do you want to restart this program ? ") 
    if answer.lower().strip() in "y yes".split(): 
     restart_program() 

FONT:Gribouillis в DANIWEB

+0

видел, пытался, не работал:/ –

+0

Что случилось? Это сработало для меня. В любом случае, я не буду удалять ответ для возможных новых людей с той же проблемой, потому что это может помочь им. – arodriguezdonaire

+0

Весь важный код в вашем ответе уже находится в коде OP. – jwodder

-1

# Это простой способ перезапустить программу. Вставьте свой код между main(): и main(). Выбор отступа правильно и тест

определяют основные():

xxxxxxxxxxxxxxxxx 
    xxxxxxxxxxxxxxxxxxxx 
    xxxxxxxxxxxxxxxxxxxx 
      xxxxxxxxxxxxxxxx Your Code here 
      fffffffffffffffff 
    cccccccccccccccccccccc 
    xxxxxxxxxxxxxxxx 
    xxxxxxxxxxxxx 
    restart = input("Do You want to run the program again ? : ").lower() 
    if restart == 'yes': 
    main() 
    elif restart == 'y': 
     main() 
    else: 
     print("Thanks for using this program") 
     exit() 

Основной()

====================== ============================================

+0

Я новичок в программировании и python, но он работает для меня. Я определил свой код в main(), и я могу перезапустить программу до тех пор, пока не введет что-либо в ожидании «да» или «y». – Jagdish

 Смежные вопросы

  • Нет связанных вопросов^_^