简体   繁体   English

10 秒后重新运行 python 脚本

[英]Rerun python script after 10 seconds

I am trying to rerun my python script every 10 seconds.我试图每 10 秒重新运行一次我的 python 脚本。 I have tried various things with the time.sleep function but nothing seems to be working.我已经尝试使用 time.sleep 函数进行各种操作,但似乎没有任何效果。 I have tried different variants of time.sleep:我尝试了 time.sleep 的不同变体:

 def job()
   # script

if __name__ == '__main__':
    while True:
        job()
        time.sleep(10)

but not finding the correct place/way to implement it.但没有找到正确的地方/方式来实现它。 I don't want to rerun a function, but the full code.我不想重新运行一个函数,而是重新运行完整的代码。

This is the script I am trying to rerun:这是我试图重新运行的脚本:

import...

def main():
    # parse the command line arguments
    args = ConfigArgumentParser(description=__doc__).parse_args()

    if _debug: _log.debug("initialization")
    if _debug: _log.debug("    - args: %r", args)

    # make a device object
    this_device = LocalDeviceObject(
        objectName=args.ini.objectname,
        objectIdentifier=('device', int(args.ini.objectidentifier)),
        maxApduLengthAccepted=int(args.ini.maxapdulengthaccepted),
        segmentationSupported=args.ini.segmentationsupported,
        vendorIdentifier=int(args.ini.vendoridentifier),

    )

    # make a sample application
    this_application = BIPSimpleApplication(this_device, args.ini.address)

    # make some random input objects
    for i in range(1, RANDOM_OBJECT_COUNT + 1):
        ravo = RandomAnalogValueObject(
            objectIdentifier=('analogValue', i),
            objectName='Temp%d' % (i,),

        )

        this_application.add_object(ravo)

    # make sure they are all there

    _log.debug("    - object list: %r", this_device.objectList)

    _log.debug("running")

    run()

    _log.debug("fini")


if __name__ == "__main__":
    main()

If you need the whole thing to run (even bootstrap code), you can use a shell script to do it.如果您需要运行整个程序(甚至是引导代码),您可以使用 shell 脚本来完成。

This won't refresh environment variables though.但这不会刷新环境变量。

#!/usr/bin/env bash

while true; do 
  sleep 10
  python script.py
done

If you need to refresh environment variables (you seem to need it because of RANDOM_OBJECTS), add eval "$(exec /usr/bin/env -i "${SHELL}" -l -c "export")" to the mix.如果您需要刷新环境变量(由于 RANDOM_OBJECTS,您似乎需要它),请将eval "$(exec /usr/bin/env -i "${SHELL}" -l -c "export")"到组合中. Source: https://unix.stackexchange.com/a/581684来源: https : //unix.stackexchange.com/a/581684

Try this:尝试这个:

if __name__ == "__main__":
    time.sleep(10)
    main()

What you can do is just restart your whole script after 10s.您可以做的就是在 10 秒后重新启动整个脚本。

Applied to your code it would look like this:应用于您的代码,它看起来像这样:

import os
import time
import json
import sys

from bacpypes.debugging import bacpypes_debugging, ModuleLogger
from bacpypes.consolelogging import ConfigArgumentParser

from bacpypes.core import run

from bacpypes.primitivedata import Real
from bacpypes.object import AnalogValueObject, Property, register_object_type
from bacpypes.errors import ExecutionError

from bacpypes.app import BIPSimpleApplication
from bacpypes.local.device import LocalDeviceObject


# Read Json
with open('ObjectList.json') as json_file:
    data = json.load(json_file)


    def get_present_value(no):
        for a in data['AnalogValues']:
            if a['ObjectIdentifier'] == int(no):
                return a['PresentValue']
        return None

ai_1 = (get_present_value(1))

print(ai_1)

# some debugging
_debug = 0
_log = ModuleLogger(globals())

# settings
RANDOM_OBJECT_COUNT = int(os.getenv('RANDOM_OBJECT_COUNT', 1))


#
#   RandomValueProperty
#

class RandomValueProperty(Property):

    def __init__(self, identifier):
        if _debug: RandomValueProperty._debug("__init__ %r", identifier)
        Property.__init__(self, identifier, Real, default=0.0, optional=True, mutable=False)

    def ReadProperty(self, obj, arrayIndex=None):
        if _debug: RandomValueProperty._debug("ReadProperty %r arrayIndex=%r", obj, arrayIndex)

        # access an array
        if arrayIndex is not None:
            raise ExecutionError(errorClass='property', errorCode='propertyIsNotAnArray')

        # return a random value

        value = ai_1

        if _debug: RandomValueProperty._debug("    - value: %r", value)

        return value


    def WriteProperty(self, obj, value, arrayIndex=None, priority=None, direct=False):
        if _debug: RandomValueProperty._debug("WriteProperty %r %r arrayIndex=%r priority=%r direct=%r", obj, value,
                                              arrayIndex, priority, direct)
        raise ExecutionError(errorClass='property', errorCode='writeAccessDenied')


bacpypes_debugging(RandomValueProperty)

#
#   Random Value Object Type
#

class RandomAnalogValueObject(AnalogValueObject):
    properties = [
        RandomValueProperty('presentValue'),
    ]

    def __init__(self, **kwargs):
        if _debug: RandomAnalogValueObject._debug("__init__ %r", kwargs)
        AnalogValueObject.__init__(self, **kwargs)


bacpypes_debugging(RandomAnalogValueObject)
register_object_type(RandomAnalogValueObject)


#
#   __main__
#

def main():
    # parse the command line arguments
    args = ConfigArgumentParser(description=__doc__).parse_args()

    if _debug: _log.debug("initialization")
    if _debug: _log.debug("    - args: %r", args)

    # make a device object
    this_device = LocalDeviceObject(
        objectName=args.ini.objectname,
        objectIdentifier=('device', int(args.ini.objectidentifier)),
        maxApduLengthAccepted=int(args.ini.maxapdulengthaccepted),
        segmentationSupported=args.ini.segmentationsupported,
        vendorIdentifier=int(args.ini.vendoridentifier),

    )

    # make a sample application
    this_application = BIPSimpleApplication(this_device, args.ini.address)

    # make some random input objects
    for i in range(1, RANDOM_OBJECT_COUNT + 1):
        ravo = RandomAnalogValueObject(
            objectIdentifier=('analogValue', i),
            objectName='Temp%d' % (i,),

        )

        this_application.add_object(ravo)

    # make sure they are all there

    _log.debug("    - object list: %r", this_device.objectList)

    _log.debug("running")

    run()

    _log.debug("fini")


if __name__ == "__main__":
    main()
    time.sleep(10)
    os.execl(sys.executable, sys.executable, * sys.argv)  # Your script restarts after 10s with this

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM