有沒有任何方法可以在沒有命令外殼的情況下運行Python腳本? 使用「.pyw」擴展命名我的文件不起作用。如何在沒有Windows控制檯出現的情況下運行Python腳本
編輯:()用的ShellExecute解決的問題
有沒有任何方法可以在沒有命令外殼的情況下運行Python腳本? 使用「.pyw」擴展命名我的文件不起作用。如何在沒有Windows控制檯出現的情況下運行Python腳本
編輯:()用的ShellExecute解決的問題
使用ShellExecuteEx函數。
BOOL ShellExecuteEx(
_Inout_ SHELLEXECUTEINFO *pExecInfo
);
這是pExecInfo: *** n顯示 - 標誌指定的應用程序是如何顯示,當它打開時
typedef struct _SHELLEXECUTEINFO {
DWORD cbSize;
ULONG fMask;
HWND hwnd;
LPCTSTR lpVerb;
LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;/*=0 if you don't want the console window to appear*/
HINSTANCE hInstApp;
LPVOID lpIDList;
LPCTSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
嘗試使用Python的pythonw.exe
可執行文件來啓動你的腳本。
在Windows操作系統,可執行文件是控制檯應用程序(python.exe
與出w
是一個控制檯應用程序)的運行表示控制檯窗口;另一方面,常規Windows應用程序不會產生黑色控制檯窗口。
你可以找到關於這兩個可執行文件的細節在這個古老的問題:pythonw.exe or python.exe?
以及有關Windows不同類型的應用程序在這裏:Difference between Windows and Console application
從另一個帖子此信息可以幫助:https://stackoverflow.com/a/30313091/6470259
python.exe
是一個控制檯(終端)應用程序在上啓動CLI型腳本。 *除非從現有控制檯窗口運行,否則將打開一個新的控制檯窗口,其中python.exe
。 * 標準流sys.stdin
,sys.stdout
和sys.stderr
被連接到 控制檯窗口。 *執行是同步:
- 如果創建一個新的控制檯窗口,它一直開到腳本終止。
- 從現有控制檯窗口調用時,提示將被阻止,直到腳本終止。
pythonw.exe
是推出一個GUI應用程序GUI /無UI不惜一切腳本。 * NO控制檯窗口已打開。 *執行是 異步:
- 當從一個控制檯窗口調用腳本僅僅是推出和提示立即返回,腳本是否仍在運行與否。 * 標準流
sys.stdin
,sys.stdout
和sys.stderr
是不可用。- 注意:除非你採取額外的步驟,這有可能意想不到的副作用:
- 未處理的異常導致腳本中止默默。
- 在Python 2.x中,簡單地嘗試使用
print()
會導致發生這種情況(在3.x中,print()
根本沒有效果)。
- 要防止從腳本,並瞭解更多內,看到 礦this answer。
- 特設,可以使用輸出重定向:謝謝,@handle。
pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
(來自PowerShell:cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
)捕獲 標準輸出和標準輸出文件。如果您確信使用的print()
是你的腳本pythonw.exe
靜靜地失敗的唯一原因,而你不感興趣的標準輸出輸出,使用 @手柄的命令,從評論:pythonw.exe yourScript.pyw 1>NUL 2>&1
買者:該輸出重定向技術貌似不是調用時工作*.pyw
腳本直接(而不是 將腳本文件路徑傳遞給pythonw.exe
)。 如果您知道爲什麼和/或它是否適合您,請告訴我是否 。您可以將可執行文件的通過 默認運行腳本控制 - 通過選擇 正確的文件擴展名 - 例如從資源管理器打開時,如:
*.py
文件默認關聯(引用)與python.exe
*.pyw
文件默認關聯(引用)與pythonw.exe
無恥抄襲[這裏](http://stackoverflow.com/a/30313091/1222951)。 –
在所有的Python安裝,因爲2.5(甚至更早),如果安裝已處理得當,.py
文件關聯到python.exe
和.pyw
文件關聯到pythonw.exe
如果關聯已被篡改,或覆蓋特定用戶,這可能是不同的。
運行在一個cmd下面的命令:
ftype | find "pythonw"
assoc | find ".pyw"
我得到:
Python.NoConFile="D:\Program Files\Python27\pythonw.exe" "%1" %*
.pyw=Python.NoConFile
如果你沒有,你可以採取一些措施來解決這個問題:
如果您不是機器的管理員,則可以將.pyw
文件與pythonw.exe
關聯。與小問題,你必須修改註冊表項之後增加額外的參數或在您.pyw文件拖放參數不會考慮到這一點(它很少使用,但仍然)
[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command] @="\"L:\\Portable_Python_2.7.3.1\\App\\pythonw.exe\" \"%1\" %*"
最好修改'HKLM \ Software \ Classes'或'HKCU \ Software \ Classes'。 HKCR虛擬鍵是這兩棵樹的合併視圖,因此修改它的結果取決於當前定義的鍵。合併使用'HKCR'的.reg文件可能會修改'HKCU'中的子密鑰(如果存在),否則將修改'HKLM'中的子密鑰(如果存在),否則在'HKLM'中創建子密鑰。因此,密鑰及其子密鑰最終可能會部分爲當前用戶定義,並部分爲本地計算機定義。 – eryksun
請注意,cmd的'assoc'和'ftype'命令僅顯示和修改'HKLM \ Software \ Classes'鍵,這些鍵僅爲用戶在資源管理器中的選擇定義了一種可能性。還有其他地方可以定義文件關聯,例如'[HKCU | HKLM] \ Software \ Classes \ Applications'以及'[HKCU | HKLM] \ Software \ Classes \ SystemFileAssociations'下的默認值。用戶當前的選擇位於HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts中,但只能使用GUI對其進行修改。 – eryksun
謝謝,現在我從C運行像巨蟒文件這個:system(「python.pyw」)。我應該如何執行它? – David
@David,'system'使用cmd來運行程序,當您從非控制檯程序運行非控制檯程序時,該程序會短暫地閃爍控制檯。如果你沒有傳遞參數給腳本,你可以使用'os.startfile(「script.pyw」)'。但首先修復.pyw文件關聯。 '[HKLM | HKCU] \ Software \ Classes \ .pyw'的默認值應該是'Python.NoConFile'。然後使用右鍵單擊「打開方式」對話框選擇始終使用Python for .pyw腳本。如果有多個Python條目,請全部嘗試,直到它正常工作,但*不*「在此PC上查找另一個應用程序」。 – eryksun