2012-04-06 24 views
3

我正在試驗文件I/O。我有一個小練習程序,在運行時創建一個文本文件。我用pyinstaller打包它,以便雙擊exe文件創建一個新文件夾,並在其中放置一個帶有「hello world」的文本文件。十分簡單。是否有可能在運行時將參數傳遞給python make exe?

然後我開始想知道main()。這只是一個像其他任何功能,對嗎?那麼這是否意味着我可以在運行時將參數傳遞給它?

我在想Steam客戶端,以及如何在快捷方式中放置'-dev'和'-console'之類的東西。有沒有辦法做到這一點,我已經做了一個python exe文件?

我可以解釋了苦頭,所以這裏有一個例子:

def makeFile(string): 
    if string: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, ' + string + '! \nHow are ya?' 
     f.close() 
    else: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, person! \nHow are ya?' 
     f.close() 

def main(string = None): 
    makeFile(string)  

所以,如果我把這個代碼,並使它成爲一個exe文件,我將能夠以某種方式加入我的可選參數。

我試過上面的代碼,並且正在運行test.exe --"myname"但是沒有工作。

有沒有辦法做到這一點?

回答

3

是的,你可以用sys.argv。看看這個鏈接:http://docs.python.org/library/sys.html#sys.argv。但請記住不要忘記import sys,然後您可以使用它。 進口SYS

# If there is an argument passed to your file 
if len(sys.argv) > 1: 
    # argv[1] has your filename 
    filename = sys.argv[1] 
    print (filename) 

# Output... 
# new-host:~ yanwchan$ python3.2 test.py text.txt 
# text.txt 

argv[0]test.py

argv[1]text.txt

編輯:不過,我對這個題目的一些更多的研究,發現了這一點:https://stackoverflow.com/a/4188500/1276534

由於katrielalex指出,也許你可以看看argparse好。?它提供了更多的功能以及安全檢查。有趣的信息。

這裏是一個偉大的教程:http://www.doughellmann.com/PyMOTW/argparse/

+0

這工作完美!謝謝!! – Zack 2012-04-06 18:03:15

+0

更新答案,做'如果len(sys.argv)> 1'來測試是否有文件名參數,並且有提示'argparse'比較好(以解決任何問題)。 – George 2012-04-06 18:13:54

2

你所尋找的是類似蟒蛇​​

或者你也可以讀出的值直接使用sys.argv

import sys 
sys.argv[0] # the name of the command that was called 
sys.argv[1] # the first argument, eg '--dev' 
sys.argv[2] # the second... 
3

什麼你」重新尋找是sys模塊還是optparse模塊。

sys會給你非常基本的控制命令行參數。

例如:

import sys 

if __name__ == "__main__": 
    if len(sys.argv)>1: 
     print sys.argv[1] 

在上面的例子,如果你要打開一個殼和型 -

test.exe "myname" 

得到的輸出將是:

myname 

請注意,sys.argv [0]是您當前正在運行的腳本的名稱。每個隨後的參數的空間限定,所以在上述例子

test.exe -- myname 

argv[0] = "test.exe" 
argv[1] = "--" 
argv[2] = "myname" 

Optparse給出了更健壯的解決方案,允許用戶定義的命令行與多個選項開關和定義將存儲適當的選擇,可以變量在運行時被訪問。

重新寫你的例子:

from optparse import OptionParser 

def makeFile(options = None): 
    if options: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, ' + options.name + '! \nHow are ya?' 
     f.close() 
    else: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, person! \nHow are ya?' 
     f.close() 



if __name__ == "__main__": 
    parser = OptionParser() 
    parser.add_option('-n','--name',dest = 'name', 
         help='username to be printed out') 
    (options,args) = parser.parse_args() 
    makeFile(options) 

您將運行與您的程序:

test.exe -n myname 

和輸出(在myfile.txt中)將是預期的:

Hello, myname! 
How are ya? 

希望有所幫助!

+0

哦,那很整齊!謝謝! – Zack 2012-04-06 18:22:07

+0

+1上的神奇的例子 – George 2012-04-06 18:33:35

0

只需要注意完整性:現在有docopt,這使得通過用簡單的語言描述複雜的命令行界面變得非常容易。記錄和解析接口實際上與docopt成爲相同的任務。

相關問題