1. ホーム
  2. python

[解決済み] pythonw.exe has stopped working "というランダムなクラッシュが発生する。

2022-02-12 04:24:07

質問

SOです。

問題のコードは以下の通りですが、他のスクリプトでもランダムに発生することがあります(エラーの原因はコードにはないと思います)。

なぜか、完全にランダムに、時々クラッシュして "pythonw.exe has stopped working" というポップアップが出るのですが、それは5時間後だったり、24時間後だったり、5日後だったり...。なぜクラッシュするのかがわかりません。

from datetime import date, timedelta
from sched import scheduler
from time import time, sleep, strftime
import random
import traceback

s = scheduler(time, sleep)
random.seed()

def periodically(runtime, intsmall, intlarge, function):

    currenttime = strftime('%H:%M:%S')

    with open('eod.txt') as o:
        eod = o.read().strip()
        if eod == "1":
            EOD_T = True
        else:
            EOD_T = False

    while currenttime >= '23:40:00' and currenttime <= '23:59:59' or currenttime >= '00:00:00' and currenttime <= '11:30:00' or EOD_T:
        if currenttime >= '23:50:00' and currenttime <= '23:59:59':
            EOD_T = False
        currenttime = strftime('%H:%M:%S')
        print currenttime, "Idling..."
        sleep(10)
        open("tca.txt", 'w').close

    open("tca.txt", 'w').close

    runtime += random.randrange(intsmall, intlarge)
    s.enter(runtime, 1, function, ())
    s.run()

def execute_subscripts():

    st = time()
    print "Running..."

    try:
       with open('main.csv'):
           CSVFile = True
    except IOError:
        CSVFile = False

    with open('eod.txt') as eod:
        eod = eod.read().strip()
        if eod == "1":
            EOD_T = True
        else:
            EOD_T = False

    if CSVFile and not EOD_T:
        errors = open('ERROR(S).txt', 'a')

        try:
            execfile("SUBSCRIPTS/test.py", {})
        except Exception:
            errors.write(traceback.format_exc() + '\n')
            errors.write("\n\n")

        errors.close()

    print """ %.3f seconds""" % (time() - st)

while True:
    periodically(15, -10, +50, execute_subscripts)

どなたか、クラッシュの原因を知る方法、または原因を知っていて直す方法をご存知の方はいらっしゃいませんか?

ありがとうございます
- ハイフレックス

解決方法は?

よくわからないが、それは かもしれない する2行と関係がある。

open("tca.txt", 'w').close

これらは、あなたが意図していることを行っていません:ファイルを開いたままにしているのです。 ファイルを開いたままにしてしまいます。 コール を取得するだけでなく、close メソッドを使用します。

open("tca.txt", 'w').close()
                          ^^

しかし、それはおそらくないでしょう。 CPythonはファイルオブジェクトがゴミになると自動的に閉じます(この場合はすぐにそうなります - 文が終わるとすぐにrefcountは0になります)。

Linuxシステムに移行した方がいいかもしれませんね ;-)

アイデア: これを python.exe の代わりに、DOSボックスから ( cmd.exe )を開いたまま無視していませんか? デバッグの大問題 pythonw.exe デスには、ポップアップするエラーメッセージを表示するコンソールウィンドウがありません。

この行は何をしているのだろう?

print "Running..."

で実行している場合は pythonw.exe を見ることはないですよね? そして、その によって、問題が発生します。 まさに どのバージョンのPythonとWindowsを実行しているか。 Standard inputstandard output は実際には存在しません。 pythonw という謎めいたものを探し当てたのを覚えています。 pythonw.exe に書き込まれたデータが多すぎて、マイクロソフトのライブラリが吹っ飛ぶという死がありました。 sys.stdout (どの print を使用します)。

見分ける方法のひとつは、これを python.exe DOSボックスからでなく、DOSボックスからで、1年間クラッシュせずに実行された場合、おそらくそれが原因でした ;-)

使用例

以下、簡単なプログラムです。

i = 0
while 1:
    i += 1
    with open("count.txt", "w") as f:
        print >> f, i
    print "hi!"

32 ビットの Windows Vista で Python 2.7.6 を使用すると 根本的に があるかないかで動作が異なります。 python.exe または pythonw.exe が実行されます。

python.exe :

C:\Python27>python yyy.py
hi!
hi!
hi!
hi!
hi!
hi!
hi!
hi!
hi!
hi!
hi!
...

それが永遠に続き、その中の値 count.txt が増え続ける。 しかし

C:\Python27>pythonw yyy.py

C:\Python27>

つまり、目に見える出力がないのです。 そしてそれは期待されていることです。 pythonw はそのプログラムを実行します 切断 をコンソールウィンドウから表示します。

ごく短い時間の後 pythonw.exe タスクマネージャーで確認できます) - 跡形もなく消えてしまいます。 その時点で

C:\Python27>type count.txt
1025

つまり、MSのライブラリは、切断されたプログラムから標準出力に "too much" が書き込まれると、まだクラップアウトしてしまうのです。 そこで print "hi!" そして、それは永遠に続くのです。

Python 3

これはPython 3では、バインディングという怪しげな手段によって、"fixed"されています。 sys.stdoutNone その下に pythonw.exe . を読むことができます。 この騒動の歴史はこちら .