Изменение значения переменной, когда скрипт постоянно работает внутри цикла - PullRequest
0 голосов
/ 22 марта 2019

Можно ли изменить значение, когда скрипт выполняется внутри цикла?

import sys

inputValue = 120

def changeValue(value):
 inputValue = value

def main():
 if inputValue == 0:
  print 'Value is'+str(inputValue)

if __name__ == '__main__':
 while True:
  main()

Я думаю изменить выполнение скрипта python app.py, вызывая функцию python app.py changeValue 23, но я не знаю, как именно это будет работать.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Существует много способов управления запущенной программой, но в первом приближении все они включают чередование между выполнением некоторой работы и проверкой ввода. Очень простой подход будет выглядеть примерно так:

import string

value = 1

def checkChangeValue():
    newValue = input()
    if newValue.isdigit():
        global value
        value = int(newValue)

def main():
    print("Value is {}".format(value))

def loop():
    main()
    checkChangeValue()


if __name__ == '__main__':
    while True:
        loop()

При этом снова и снова запускается функция main («выполнить какую-то работу»), а затем checkChangeValue («проверять наличие ввода»). Однако это может не сработать так, как вы хотите, потому что input() ждет, когда вы наберете что-то и нажмете клавишу ввода, поэтому оно заблокирует выполнение main. Чтобы обойти это, вы можете добавить темы:

import string
import threading

value = 1

def checkChangeValue():
    global value
    while True:
        newValue = input()
        if newValue.isdigit():
            value = int(newValue)

def main():
    print("Value is {}".format(value))


if __name__ == '__main__':
    threading.Thread(target=checkChangeValue).start()
    while True:
       main()

Любой из этих методов может работать в зависимости от ваших потребностей. Для более изощренного подхода вы можете обратиться к библиотеке pynput , которая позволяет вам взаимодействовать с вашей программой посредством ввода с клавиатуры или мыши.

Существует также много других способов управления запущенной программой! Вы можете общаться с вашей программой через файлы, каналы, сокеты, разделяемую память и т. Д. Это обычно называется «Межпроцессное взаимодействие» или IPC.

1 голос
/ 23 марта 2019

Вы должны объявить inputValue как глобальную переменную, используя оператор global внутри функции changeValue, чтобы операторы присваивания этой переменной внутри функции применялись к inputValue как глобальная переменная; в противном случае присваивание будет inputValue как локальной переменной changeValue:

def changeValue(value):
    global inputValue
    inputValue = value

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

import sys

def changeValue(value):
    return value + 1

def main(value):
    value = changeValue(value)
    print('Value is %d' % value)

if __name__ == '__main__':
    inputValue = int(sys.argv[1])
    while True:
        main(inputValue)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...