2

Plex を使用しており、Plex API を使用して Plex サーバーのステータスを取得し、継続的に更新しようとしています。ステータスが変更された場合、それが行うことがいくつかあります。これが私のコードです(無関係な部分を編集しました):

import requests
import time

ip = '127.0.0.1'
port = '####'


def get_status(last_media_type, last_state):
    data = requests.get('http://' + ip + ':' + port + '/status/sessions', verify=False)
    if home:  # Ignore this part. Redacted code
        if '<MediaContainer size="0">' in data.text:  # If nothing is playing
            media_type = 'None'
            state = 'STOPPED'
        else:  #  Get what's playing and its status
            media_type_start = data.text.find('type=\"')
            media_type_end = data.text.find('updatedAt=')
            media_type = data.text[media_type_start + 6:media_type_end - 2].capitalize()
            print('Type: ' + str(media_type))
            state_prefix_start = data.text.find('<Player address=')
            state_prefix_end = data.text.find('<TranscodeSession key=')
            state_prefix = data.text[state_prefix_start:state_prefix_end]
            state_start = state_prefix.find('state=\"')
            state_end = state_prefix.find('title=')
            state = state_prefix[state_start + 7:state_end - 2].upper()
        if last_media_type != media_type or last_state != state:  # THIS IS IMPORTANT. I don't want to execute the next part if nothing has changed.
            # DO STUFF, redacted
        if state == 'PLAYING':
            interval = 1
        elif state == 'PAUSED':
            interval = 10
        elif state == 'STOPPED':
            interval = 15
    else:
        interval = 60 * 3  # if nobody home, only check once every 3 minutes
    time.sleep(interval)
    get_status(media_type, state)

get_status('a', 'b')  # filler arguments used to initiate script

問題

残念ながら、30分ほどすると、次のようになります。

RecursionError: maximum recursion depth exceeded in comparison

これはトレースバックです (編集のため行番号は一致しませんが):

Traceback (most recent call last):
  File "H:/Users/micha/Documents/Scripts/Python/plexStatus.pyw", line 63, in <module>
    p = psutil.Process(os.getpid())  # Get PID for this script
  File "C:\Python351\lib\site-packages\psutil\__init__.py", line 349, in __init__
    self._init(pid)
  File "C:\Python351\lib\site-packages\psutil\__init__.py", line 375, in _init
    self.create_time()
  File "C:\Python351\lib\site-packages\psutil\__init__.py", line 636, in create_time
    self._create_time = self._proc.create_time()
  File "C:\Python351\lib\site-packages\psutil\_pswindows.py", line 282, in wrapper
    return fun(self, *args, **kwargs)
  File "C:\Python351\lib\site-packages\psutil\_pswindows.py", line 422, in create_time
    if self.pid in (0, 4):
RecursionError: maximum recursion depth exceeded in comparison

質問

実行間で 1 秒だけ待機しながら、再帰エラーなしでこれを機能させるにはどうすればよいですか?

私の推測では、以前の呼び出しの変数を引き続き使用しながら、このスクリプトを呼び出すより良い方法があると思います。方法がわかりません。編集済みの別の部分で既に使用しているものを使用できると思いますpickleが、可能であれば大量の読み取り/書き込みを避けたいと思います。または、実際には、機能を維持しながら、メモリをできるだけ消費しないようにしてください。

注: 解析するためのより良い方法があると確信しています。私はプログラミングが初めてです。これを修正しながら同時に調査しています。

これを修正しようとしてこのコードを数回編集したので、これが他のエラーをスローしないかどうかはわかりません。それは私が修正しようとしている再帰です。

これには PlexPy のようなツールがあることを知っています。より小さく、主要なリソースを大量に消費することなく継続的に実行できるものを自分で作成しようとしています。

4

2 に答える 2

1

再帰を使用する代わりに、無限ループに while ループを使用できます。ご覧のとおり、再帰は無限ではありません-再帰はスタックを増加させるため、制限されます。

于 2016-01-27T22:54:04.343 に答える