今pythonでシステム開発をしています。
一番最初に呼ばれるファイルに以下の記述をしています。
python
1app.py 2# -*- coding: utf-8 -*- 3import sys 4import io 5sys.path.insert(0, '/var/www/test') 6sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8') 7
上記の記載をし、実行すると下記のエラーが発生してしまいます。
File "/var/www/test/app.py", line 5
ValueError: I/O operation on closed file, referer: http://localhost/
pythonは3.9を使ってます。
記述方法に間違いがありますでしょうか?
わかる方、教えてください。
2点質問させてください。
app.pyはどういう風に実行していますか?
python app.py
の様に実行しているんでしょうか?
あと、ソースコードの1行目に「app.py」とありますが、これはソースコードには書いていませんよね?
標準入力をクローズした状態で実行すると同じエラーメッセージが表示されます。推測になりますが、デーモンプロセスから子プロセスとして実行されているのではないでしょうか。
>>> import sys
>>> import io
>>> sys.stdin.close()
>>> sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file
app.pyはlimuxサーバ上で実行されます。
mod_wsgiを使用して、アクセスがあったらapp.pyが起動するような設定になってます。
>デーモンプロセスから子プロセスとして実行されているのではないでしょうか。
すみません。これの意味がわかってないです。
どこを確認したらわかるでしょうか?
> どこを確認したらわかるでしょうか?
> mod_wsgiを使用して、アクセスがあったらapp.pyが起動するような設定
はい、まさにその様な状況(mod_wsgi から python プログラムを実行)であることが判りました。
以下は mod_wsgi のドキュメントからの引用ですが、標準入力(sys.stdin)へのアクセスが制限されているそうです。
WSGIRestrictStdin — mod_wsgi 5.0.0 documentation
https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIRestrictStdin.html
> In the interests of promoting portability of WSGI applications, mod_wsgi restricts access to sys.stdin and will raise an exception if an attempt is made to use sys.stdin explicitly.
なるほど。そういうことなんですね。
このような場合、対策はできないのでしょうか?
> このような場合、対策はできないのでしょうか?
以下のドキュメントによれば設定で回避できそうです。
Reading From Standard Input
https://github.com/GrahamDumpleton/mod_wsgi/blob/develop/docs/user-guides/application-issues.rst#reading-from-standard-input
> WSGIRestrictStdin Off
ありがとうございます。
このエラーは解消しました。

回答1件
あなたの回答
tips
プレビュー