2011-09-23 56 views
3

我有一個名爲「gcc_opt.pyw」的Python腳本,我將它的目錄包含到Windows PATH環境變量中。Python腳本,參數沒有轉移到腳本

但是沒有一個命令行參數被傳遞給腳本。打印sys.argv告訴我只有argv-list中的文件名。

此命令:

gcc_opt HelloWorld.c -o HelloWorld.exe -shared 

結果

["C:\\Scripts\\gcc_opt.pyw"] 

你能告訴我,爲什麼沒有其他的參數呢?

我不知道它是否重要,但我已經將python.exe設置爲執行.pyw文件的默認程序,因爲我沒有看到使用pythonw.exe的任何打印(爲什麼這是) 。

+0

嘗試將目錄切換到gcc_opt的目錄並運行:'python gcc_opt.pyw HelloWorld.c -o HelloWorld.exe -shared' – rubik

回答

5

您無法獲取參數的原因是因爲您打破了.py 關聯,因此您可以雙擊這些文件以在NotePad ++, 中打開它們,隨後打破.pyw關聯來執行.py應該做的。

簡而言之,您忘記在您的「自定義」(損壞).pyw關聯的Python.exe命令 行的末尾包含%*

ASSOC和FTYPE命令用於顯示關聯和文件類型,即 運行哪個程序來處理具有特定擴展名的文件。這裏是 什麼這些命令產生我的系統上:

C:\test>assoc .py 
.py=Python.File 

C:\test>assoc .pyw 
.pyw=Python.NoConFile 

C:\test>ftype python.file 
python.file="C:\Python27\python.exe" "%1" %* 

C:\test>ftype python.noconfile 
python.noconfile="C:\Python27\pythonw.exe" "%1" %* 

正常的.py協會運行python.exe有一個控制檯窗口,以便您 可以看到報表打印輸出。

正常的.pyw關聯運行pythonw.exe而沒有控制檯窗口。

您可以在每個命令行末尾看到一個%*。這就是將 參數發送給命令的原因。 (實際上,%1是第一個參數,並%* 意味着「所有剩餘的參數」。)

當您嘗試運行在命令行Python文件而無需鍵入其 擴展或最初的「蟒蛇」命令,幾件事情發生。

首先使用PATHEXT環境變量來查找匹配的擴展名。 在你的情況下,它發現你的命令名稱「gcc_opt」+ .PYW導致一個 匹配文件。

那麼對於.PYW文件關聯擡頭一看,發現該文件類型 Python.NoConFile,而你的情況設置爲「python.exe」(應該是 pythonw.exe)。 (您可以在註冊表中的HKEY_CLASSES_ROOT下看到這些信息。)

然後系統創建一個從命令模板實際的命令行中發現 該文件類型,而你的情況可能是

"[your-python-path]python.exe" "%1" 

這告訴它僅使用第一個參數,你的Python腳本名稱 「gcc_opt.pyw」。

快速解決方法是將%*添加到該命令的末尾。

正確的修復方法是將事情恢復到正確的關聯和打開Python文件以便通過更標準的方法編輯(將圖標拖放到 NotePad ++上,或者右鍵單擊並使用NotePad ++編輯)。

+0

哇,我印象深刻。 ^^感謝這個令人敬畏的解釋。 +1,已接受。 –

+1

樂意幫忙。 =) – Todd

+0

在Windows上(我懷疑你使用二進制安裝程序安裝了Python的任何平臺),如果你想快速修復,你可以運行安裝程序並選擇'修復'選項。當然,這取決於你是否已經安裝了二進制安裝程序,我認識並不總是如此。 – mdscruggs

2

您應該將其重命名爲.py。

.pyw旨在用於GUI應用程序,因爲它們不需要控制檯窗口。

+1

但我不希望在雙擊它時執行它,而不是這樣從命令行調用它時需要嗎?我的意思是,執行的默認程序是python.exe,但目前它是notepad ++。exe。 :) –

+1

@Niklas R:在Windows上,'.py'和'.pyw'擴展名的缺省開放(即雙擊)動作是分別用'python.exe'或'pythonw.exe'運行腳本。要編輯腳本,通常需要右鍵單擊,然後從上下文菜單中選擇「Edit with ...」(或先啓動編輯器並從其中打開文件)。 – martineau