windows10でrxpyのmarblesでエラー

windows10でrxpyのmarblesでエラーが出る。

ubuntu16ではエラーはでなかった。


windows10: python 3.6 rxpy 1.5.7

rxpy tutorial

1.エラー発生

rxjsのtutorialを試してみると、エラーがでた。

rxpy tutorial

from rx import Observable, Observer
from rx.testing import marbles

xs = Observable.from_marbles("a-b-c-|")
xs.to_blocking().to_marbles()

>>>> エラー出力
Traceback (most recent call last):
  File "d:\py36work\rxpy\marblesTest.py", line 12, in 
    out = xs.to_blocking().to_marbles()
  ......... 中略 ........
  File "c:\python36\lib\site-packages\rx\concurrency\schedulerbase.py", line 62, in to_relative
    timespan = timespan - datetime.fromtimestamp(0)
OSError: [Errno 22] Invalid argument
	    

xs.to_blocking().to_marbles() でエラー。

"c:\python36\lib\site-packages\rx\concurrency\schedulerbase.py"の

class SchedulerBase / def def to_relative(cls, timespan):

timespan = timespan - datetime.fromtimestamp(0)

でエラーがでている。

2.調べてみた


# rx/concurrenty/schedulerbase.py

from datetime import datetime, timedelta

from rx.core import Scheduler, Disposable
from rx.disposables import MultipleAssignmentDisposable
from rx.internal.basic import default_now

class SchedulerBase(Scheduler):
.......

    @classmethod
    def to_relative(cls, timespan):
        """Converts time value to milliseconds"""
        if isinstance(timespan, datetime):
            timespan = timespan - datetime.fromtimestamp(0) <<<< ここでエラー発生
            timespan = int(timespan.total_seconds()*1000)
        elif isinstance(timespan, timedelta):
            timespan = int(timespan.total_seconds()*1000)

        return int(timespan)
	    

3.もうちょっと調べてみる

to_relativeの引数timespanの型を調べる。


	      @classmethod
    def to_relative(cls, timespan):
        """Converts time value to milliseconds"""
        if isinstance(timespan, datetime):
            print(type(timespan))
            timespan = timespan - datetime.fromtimestamp(0)
            timespan = int(timespan.total_seconds()*1000)
        elif isinstance(timespan, timedelta):
            timespan = int(timespan.total_seconds()*1000)
      
      >>>>
   	    <class 'datetime.datetime'>

timespanはdatetime.datetime型で、

datetime.datetime.fromtimestamp(0)

との差をとってdeltatime型に変換している。


datetime.fromtimestamp(0)で1970.1.1のunix timeを取得しているが

日本だと、utc + 9でunix timeがマイナス値になってエラーになっている模様...

xs.to_blocking().to_marbles() でエラー。

"c:\python36\lib\site-packages\rx\concurrency\schedulerbase.py"の

class SchedulerBase / def def to_relative(cls, timespan):

timespan = timespan - datetime.fromtimestamp(0)

でエラーがでている。

4.修正する

1970.1.1のunix timeの取得に

datetime.datetime(1970,1,1)

をつかうと、エラーがでない。

import文でdatetime.datetime >>> datetimeとしてimportされているので

datetime(1970,1,1)に置き換えてみる。


	      @classmethod
    def to_relative(cls, timespan):
        """Converts time value to milliseconds"""
        if isinstance(timespan, datetime):
            #timespan = timespan - datetime.fromtimestamp(0)
      timespan = timespan - datetime(1970,1,1)    <<<< ここ修正
            timespan = int(timespan.total_seconds()*1000)
        elif isinstance(timespan, timedelta):
            timespan = int(timespan.total_seconds()*1000)

これで最初のコードがはしり、printしてみると


xs = Observable.from_marbles("a-b-c-|")
out = xs.to_blocking().to_marbles()
print(out)
>>>
a-b-c-|

と出力された。


ちなみにubuntu16.04のpython3で動作させると、エラーはでない。

issueも書いてみた。

rxpy issues
ブロトピ:今日のブログ更新