私はPythonでIRCボットを書いています。
Linux用とWindows用のスタンドアローンバイナリを作りたいのですが、どうすればいいですか?そして、主にボットが起動したときにコンソールウィンドウを隠して、ユーザがウィンドウを見ることができないようにしたいです。
そのためにはどうしたらいいのでしょうか?
拡張子を.pyw
にして保存するだけです。これで、コンソールウィンドウが開かなくなります。
Windowsでは、「実行可能モード」という概念はありません。Pythonのインストーラは自動的に.pyファイルをpython.exeと関連付け、Pythonファイルをダブルクリックするとスクリプトとして実行されるようにします。拡張子は.pywとすることもでき、その場合、通常表示されるコンソールウィンドウは抑制されます。
linuxでは、そのまま実行すれば問題ありません。 Windowsでは、pythonwの実行ファイルを使用したい。
なるほど、コメントの質問を理解すると、コマンドラインからbotを起動したコマンドウィンドウをその後消すにはどうしたらいいかということですね?
$ nohup mypythonprog &
C:/> start pythonw mypythonprog
その通りだと思います。 いずれにせよ、これでターミナルを閉じることができます。
nohup mypythonprog &を使用すると、プロセスを中断することなくターミナルウィンドウを閉じることができます。また、クラウド上で動作していて、シェルプロセスをぶら下げたままにしたくない場合は
exit` を実行することもできます。
プログラムを拡張子 .pyw
で保存すると、pythonw.exe
で開かれるようになります。シェルウィンドウはありません。
例えば、foo.py
があれば、foo.pyw
にリネームする必要があります。
PythonインタープリターがインストールされているWindowsコンピューターでPythonスクリプトを実行することだけを行う場合は、保存したスクリプトの拡張機能を「.py」から「.pyw」に変換するだけでうまくいくはずです。
ただし、py2exeを使用してスクリプトを任意のWindowsマシンで実行されるスタンドアロンアプリケーションに変換する場合は、「setup.py」ファイルに次の変更を加える必要があります。
次の例は、Tkinterを使用して作成された単純なpython-GUIです。
from distutils.core import setup
import py2exe
setup (console = ['tkinter_example.pyw'],
options = { 'py2exe' : {'packages':['Tkinter']}})
上記のコードの「コンソール」を「ウィンドウ」に変更します。.
from distutils.core import setup
import py2exe
setup (windows = ['tkinter_example.pyw'],
options = { 'py2exe' : {'packages':['Tkinter']}})
これにより、Tkinterで生成されたGUIのみが開き、コンソールウィンドウは開きません。
これはあなたのコンソールを隠します。 最初にこの行をコードに実装して、最初にコンソールの非表示を開始します。
import win32gui, win32con
The_program_to_hide = win32gui.GetForegroundWindow()
win32gui.ShowWindow(The_program_to_hide , win32con.SW_HIDE)
いくつかの追加情報。 このスレッドの前半でMohsen Haddadiが投稿したwin32guiソリューションが必要な状況の場合:
python 361以降、win32gui& win32conはpython stdライブラリの一部ではありません。 それらを使用するには、pywin32パッケージをインストールする必要があります。 pipを介して可能になりました。
pywin32パッケージの背景情報の詳細は、https://stackoverflow.com/questions/6624672/how-to-use-the-win32gui-module-with-pythonです。
また、フォアグラウンドのウィンドウを誤って閉じないようにウィンドウを閉じている間に裁量権を適用するには、解像度を次の行に沿って拡張できます。
try :
import win32gui, win32con;
frgrnd_wndw = win32gui.GetForegroundWindow();
wndw_title = win32gui.GetWindowText(frgrnd_wndw);
if wndw_title.endswith("python.exe"):
win32gui.ShowWindow(frgrnd_wndw, win32con.SW_HIDE);
#endif
except :
pass