質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2523閲覧

Python3 stderrでエラーを知りたい

person

総合スコア224

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/09/17 01:59

編集2020/09/17 02:33

Windowsでは下記のようなソースコードでエラーをファイルに出力してくれますが、Raspberry Piで実行したときは真っ白なままです。
(どちらでも同じコードを使用)

Raspberry Piでは扱うことができないのでしょうか?

import os import sys FILE = os.path.dirname(sys.argv[0]) + "/" + "__error__.csv" sys.stderr = open(FILE, "a") class Test: def __init__(self): print("__init__") def func(self): print("1") prrrint("test") # 関数名を間違えている。この例の場合はここのエラーを知りたい print("2") t = Test() t.func()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aokikenichi

2020/10/01 10:21

「真っ白なままです。」 とはどういうことでしょうか。 ファイルは出来ているが中身なしということでしょうか? 今RasPiが手元にないので検証できませんが、RasPiというよりもOSの違いかなと FILE = os.path.dirname(sys.argv[0]) + "/" + "__error__.csv" が怪しそうなので試しに FILE = "./__error__.csv" とかで直下で試してはいかがでしょうか
person

2020/10/06 02:34

> 「真っ白なままです。」とはどういうことでしょうか。 > ファイルは出来ているが中身なしということでしょうか? そうです。 > 直下で試してはいかがでしょうか やはり中身なしでした・・・。
aokikenichi

2020/10/06 03:28

ごめんなさい私にはこれ以上分からないです。 OSが違うので入出力周りは仕様が違うのかも知れません。 リダイレクション等で対応する方が無難かなと思います。
toast-uz

2020/10/07 13:14

sys.argv[0] を使われているため、どういう実行のしかたをされているかが必要です。 コマンドラインでの実行形式、実行をしたディレクトリを教えてください。 そもそもsys.argv[0] を使う理由は何でしょうか?普通に実行すると、os.path.dirname(sys.argv[0])は""になってしまいます。
person

2020/10/07 23:41

> コマンドラインでの実行形式、実行をしたディレクトリを教えてください。 IDLE(エディタ)で開いて Run > Run Module で実行しています。 ターミナルで cd desktop sudo python3 main.py ← sudo がないとパーミッションエラーが出る としてもCSVファイルは空です。 > そもそもsys.argv[0] を使う理由は何でしょうか? ファイルの位置を後から変更する可能性もあるので出力場所を固定にしたくなかったからです。 >普通に実行すると、os.path.dirname(sys.argv[0])は""になってしまいます。 print()でパスの確認をしましたが、""にはなりませんでした。 デスクトップで実行したため、"/home/pi/デスクトップ"が入っていました。
dodox86

2020/10/08 00:49 編集

sys.argv[0]はスクリプトの名前になるのではないでしょうか。 https://docs.python.org/ja/3/library/sys.html?highlight=sys%20setprofile ご提示のコードは、意図どおりですか。 また、Python3の正確なバージョンを質問文中に追記してください。 手持ちの(古い)Raspbian OSの古いPython3で一部修正したコードで試したところopen()のところでエラーになりました。(軽く動作させただけで追ってませんが) > pi@raspberrypi ~ $ python3 main2.py /home/pi File "main2.py", line 8 sys.stderr = open(FILE, "a") ^ SyntaxError: invalid syntax pi@raspberrypi ~ $ python3 --version Python 3.2.3
person

2020/10/08 00:52

$ python3 --version Python 3.5.3
dodox86

2020/10/08 02:16

私のコメント、 > open()のところでエラーになりました。 については、私の方の誤りでした。失礼しました。問題が再現しないので試したことの情報共有がほとんどですが、回答を投稿しました。ご覧ください。
guest

回答2

0

ベストアンサー

ご提示のコードをもとに以下の3つのLinux環境で試しましたが、「error.csv」ファイルへはエラー出力されていました。問題の現象が同じようには再現しませんね。一応、こちらで試したことを回答として投稿しておきます。(ですので、必ずしも解決できるとは限りません)

  • ラズパイ(Debian 7.1 - Wheezy) + Python 3.2.3
  • ラズパイ2(Debian 10.4 - Buster) + Python 3.7.3
  • Windows10 (WSL/Ubuntu 18.04.4) + Python 3.6.9

他回答者様の回答欄コメントに「CSVファイルは空のままでした。」とありましたが、「error.csv」は作成されるのだけれども、空(ファイルサイズが0バイト)のままなのであれば、
標準エラー出力が何らかの理由により正しくフラッシュされていないのかもしれません。標準エラー出力はプログラムが終了すれば自動的に閉じられるはずですが、Python3であること、FILE = '/home/pi/__error__.csv' でリダイレクト相当のことをしているというので、環境依存で何らかの問題が起きているように思います。

以下のコードで試してみてください。ファイルのPATHは絶対PATHにし、プログラム終了時にsys.stderrを明示的、強制的にフラッシュ、クローズさせるようにしたものです。

Python3

1import os 2import sys 3 4#FILE = os.path.dirname(sys.argv[0]) + "/" + "__error__.csv" 5FILE = '/home/pi/__error__.csv' 6sys.stderr = open(FILE, "a", buffering=1) 7 8class Test: 9 def __init__(self): 10 print("__init__") 11 def func(self): 12 print("1") 13 prrrint("test") # 関数名を間違えている。この例の場合はここのエラーを知りたい 14 print("2") 15 16t = Test() 17t.func() 18 19# 強制的にフラッシュ、クローズ 20sys.stderr.flush() 21sys.stderr.close()

投稿2020/10/08 02:13

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

person

2020/10/08 03:25

回答にあるソースコードで試したら出力されました。 試しに FILE = os.path.dirname(sys.argv[0]) + "/" + "__error__.csv" こっちでやってみたらこれも出力されました。 フラッシュ、クローズなどをコメントアウトしても出力されました。 openの引数のbuffering=1を設定しているかどうかで変わっているように見えます。
dodox86

2020/10/08 03:30

buffering=1は私も疑って試したのですが、再現しませんでした。でも、バッファリングが影響しているとは思います。
person

2020/10/08 05:00

環境によってはbefferingの設定もしたほうがいいんですね。 わかりました。ありがとうございます。
dodox86

2020/10/08 05:11 編集

python3のopenにおけるbufferingのデフォルト値はそのファイルの形態によって異なるようで、 https://docs.python.org/ja/3.5/library/functions.html?highlight=open#open 明示的にそれをセットするか否かで、挙動が変わっているのかもしれませんね。環境、OSやランタイムとの組み合わせ、Python3.x実装特有のissueであったりするかもしれません。(未確認での、推測のみです)
guest

0

現象から判断すると、ルートディレクトリにファイル作成権限があるが、作ったファイルの書き込み権限が無い、という状態だと考えられます。

作成された /__error__.csv のバーミッションを確認してください。

また、切り分けのために、/home/ユーザ名/__error__.csv で同様なことが発生するか確認してください。

投稿2020/10/07 13:27

編集2020/10/07 13:27
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

person

2020/10/07 23:48 編集

> 作成された /__error__.csv のバーミッションを確認してください。 $ ls -l デスクトップ/__error__.csv -rw-r--r-- 1 pi pi 0 10月 7 17:00 デスクトップ/__error__.csv > また、切り分けのために、/home/ユーザ名/__error__.csv で同様なことが発生するか確認してください。 念のためパーミッションをターミナルから chmod 777 /home/pi/__error__.csv とした後にソースコード上で/home/pi/デスクトップ/__error__.csvに指定してやってみましたが、CSVファイルは空のままでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問