LoginSignup
toshi0413
@toshi0413

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

python2回呼び出し

pythonで自分で作った.pyファイルのプログラムを、べつのpythonプログラムでimportして使用したいですが、その際にscheduleモジュールで 指定時間に定期実行したいのです。
しかし、一回の呼び出しはうまくいきますが
2回目おなじプログラムを実行すると止まってしまい読みだせません。エラーも何も出ません。
一回の実行で2回importできないpythonの仕様なんでしょうか?
それとも回避する方法がありますでしょうか?

0

3Answer

ソースコードを示してもらわないと、何が起きているのか判断するのは難しいです。

import では、ファイルを読み込んでモジュールオブジェクトを作って変数に代入します。
モジュールオブジェクトを作る際にモジュールに書かれたスクリプトが実行されます。
モジュールオブジェクトはキャッシュされ、2回目以降のimportではキャッシュしたモジュールオブジェクトが再利用され、再実行はしません。
モジュールには定数・変数の初期化と関数・クラス定義をしておき、1回の実行で動作準備完了し、関数やクラスを呼び出して使えるように作ります。
そして、スケジュール処理からモジュール内の関数やクラスを呼び出すように作ります。

>>> import math
>>> math
<module 'math' (built-in)>
>>> id(math)
140070534706096
>>> import re
>>> re
<module 're' from '/usr/lib/python3.8/re.py'>
>>> id(re)
140070534743200
>>> import math  # 2回目以降のimportはキャッシュを再利用、同一id
>>> id(math)
140070534706096
>>> import re
>>> id(re)
140070534743200
>>> globals()  # importしたモジュールはグローバル変数に代入されている
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class'_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
 'math': <module 'math' (built-in)>,
 're': <module 're' from '/usr/lib/python3.8/re.py'>}

PEP8: Pythonコードのスタイルガイド」に書いてありますが、import文はファイルの先頭にまとめて書きましょう。

import文 は常にファイルの先頭、つまり モジュールコメントや docstring の直後、そしてモジュールのグローバル変数や定数定義の前に置くようにします。

0

Jenkins(ジェンキンス)を導入するのは重たいので、crontab+rsyncで定刻上書きではダメですか?
但し、importはトップに配置すると、sigHUP(trap)では正常にロードされない事象があり、関数の配下に記述したことがあります。
 それ以降、importはトップに配置?に注意を払っています。

暇人x

0

以前 scheduleライブラリ を使用して定期実行させたことがありますが、特にそういったことは起きませんでした。Pythonにそういった仕様はないと思います。

一応問題が起きそうな点としては while ループ辺りな気もしますが、詳細が分からないのでなんとも言えません。。

1、2年前を最後に使っていないので書き方よく覚えていませんが、
もしかして、

while True:
    schedule.run_pending()
    time.sleep(1)

ではなく、

schedule.run_pending()

みたいな感じで書いていませんか?
もしかしたらそう書くと1回しか実行されないかもしれません。

0

Your answer might help someone💌