89450


１．デバグ用のログ出力として`print`文を書いていますが、exe化したときにこの部分はどうなるのでしょうか？ツール側が都合よく無視してくれるのでしょうか？

２．ソースコード上のprint文をテキストファイルかなんかで出力する方法はありますか？  
例えば、コンソールを出したくない、`--noconsol`というようなコマンドライン引数がありますが、こういう感じの引数、その他何らかのコマンドなどでファイル名を指定したら、うまい具合にテキストファイル出力してくれるような方法はありますか？

※exe化はこんな感じでやっています。

[Pycharmでexeファイルを作る方法](https://nonbiri-nonbiri.com/archives/21)

●私の環境について  
・Python 3.9.7  
・tkinter '8.6.12'  
・PyCharm 2021.3.3 (Community Edition)

よろしくお願いします。


CC BY-SA 4.0
2022-06-16T01:22:14.437
89405
2022-06-17T15:15:56.450
2022-06-16T02:38:21.110
3060
43160
question
python python3 pycharm
print文が記述されたソースコードをexe化したときのprint文の扱われ方について


>
> １．デバグ用のログ出力としてprint文を書いていますが、exe化したときにこの部分はどうなるのでしょうか？ツール側が都合よく無視してくれるのでしょうか？

質問の2.に書かれたような--noconsoleのオプションを指定しない限り、通常の標準入出力が使われるようです。

プログラムがコマンドプロンプトやコンソールウインドウ等のCUIから起動されれば、そのCUIウインドウに出力されます。  
実行ファイルをダブルクリック等で起動するとGUIのウインドウと同時にコンソールのウインドウも表示され、それに出力されます。

> ２．ソースコード上のprint文をテキストファイルかなんかで出力する方法はありますか？

コメントに示した記事を含めてこんな記事が参考になるでしょう。  
[PyInstaller packaged application works fine in Console mode, crashes in
Window mode](https://stackoverflow.com/q/13429924/9014308)  
[Pyinstaller noconsole option makes exe fatal error
[Solved]](https://stackoverflow.com/q/59484223/9014308)

つまり別のファイルをopenして`sys.stdout`や`sys.stderr`を入れ替えてしまえば良いわけです。  
コマンドラインオプションを定義したり、configとかiniファイルでそうした機能を扱うようにして、それに設定されていたら指定されたテキストファイル等に出力するようにすれば良いと思われます。

* * *

例えばtkinterで作るプログラムの冒頭にこんな記述をしておくと、スクリプトをそのままPythonで実行したり、PyInstallerで--
noconsoleを指定せずに作成した実行ファイルでは、いずれのファイルも`<class '_io.TextIOWrapper'>`と表示されます。

[code]

    import sys
    import tkinter as tk
    
    si = type(sys.stdin)
    so = type(sys.stdout)
    se = type(sys.stderr)
    print(si)
    print(so)
    print(se)
    
[/code]

一方PyInstallerで--noconsoleを指定すると何も表示されないので、以下のようにファイルにリダイレクトすると：

[code]

    import sys
    import tkinter as tk
    
    si = type(sys.stdin)
    so = type(sys.stdout)
    se = type(sys.stderr)
    
    f = open('output.txt','a',encoding='UTF-8')
    sys.stdout = f
    sys.stderr = f
    
    print(si)
    print(so)
    print(se)
    
[/code]

結果は以下のようにstdinが`NoneType`でstdout,stderrが`NullWriter`となります。

[code]

    <class 'NoneType'>
    <class '__main__.NullWriter'>
    <class '__main__.NullWriter'>
    
[/code]

`NullWriter`はドキュメント上は以下にしかあらわれないのですが、`our dummy NullWriter`ということで、--windowedや
--noconsoleが指定された場合に設定する何もしない標準出力/エラー出力ファイルと言うことなのでしょう。

[Changelog for PyInstaller 3.0 –
3.2.1](https://pyinstaller.org/en/v3.6/CHANGES-3.html)

> 3.2 (2016-05-03)
>
>   * For windowed mode add `isatty()` for our dummy NullWriter (#1883)
>


CC BY-SA 4.0
2022-06-17T15:15:56.450
89450
2022-06-17T15:15:56.450
26370
89405
answer