PythonでIRCボットを書いています。
LinuxおよびWindows用のスタンドアロンバイナリを作成したいと思います。そして主に、ボットが開始されたときにコンソールウィンドウが非表示になり、ユーザーがウィンドウを表示できないようにすることを望みます。
そのために何ができますか?
.pyw
拡張子を付けて保存するだけです。これにより、コンソールウィンドウが開かなくなります。
Windowsシステムでは、「実行可能モード」という概念はありません。 Pythonインストーラーは、.pyファイルをpython.exeに自動的に関連付けるため、Pythonファイルをダブルクリックするとスクリプトとして実行されます。拡張子は.pywにすることもできます。その場合、通常表示されるコンソールウィンドウは抑制されます。
Linuxでは、実行するだけで問題ありません。 Windowsでは、pythonw実行可能ファイルを使用します。
さて、コメントの質問を理解したら、コマンドラインからボットを開始したコマンドウィンドウを後で削除する方法を尋ねていますか?
$ Nohup mypythonprog&
C:/> pythonw mypythonprogを起動します
I 思考そうです。いずれにせよ、これでターミナルを閉じることができます。
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']}})
上記のコードの「コンソール」を「windows」に変更します。
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パッケージをインストールする必要があります。ピップ。
Pywin32パッケージの詳細な背景情報は、 Pythonでwin32guiモジュールを使用するには? にあります。
また、ウィンドウを閉じるときに慎重に適用して、フォアグラウンドのウィンドウを誤って閉じないようにするには、次の行に沿って解像度を拡張できます。
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