2013-03-07 76 views
6

我試圖獲取命令行給出的文件名。例如:Python stdin文件名

python3 ritwc.py < DarkAndStormyNight.txt

我試圖讓DarkAndStormyNight.txt

當我嘗試fileinput.filename()我得到SYS回到同一.stdin。這可能嗎?我不是在尋找返回當前腳本名稱的sys.argv [0]。

謝謝!

回答

4

一般這是不可能獲得一個平臺無關的方式的文件名。其他答案涵蓋了合理的選擇,例如在命令行上傳遞名稱。

在Linux,以及一些相關的系統,您可以通過下面的技巧獲取文件的名稱:

import os 
print(os.readlink('/proc/self/fd/0')) 

/proc /是在Linux上一個特殊的文件系統,提供有關本機進程的信息。 self表示當前正在運行的進程(打開文件的進程)。 fd是包含進程中每個打開文件描述符的符號鏈接的目錄。0是stdin的文件描述符編號。

+0

嗨nneonneo,你知道爲什麼我的ubuntu的確有路徑'/ proc/self/fd/0',但是當我做'./test.py 8090PZ 2015-04-28 01:16:31

0

我不認爲這是可能的。就你的python腳本而言,它正在寫入stdout。事實上,你正在捕獲寫入標準輸出並將其寫入文件到shell中與python腳本無關。

1

事實上,因爲它縫了Python無法看到文件名時的標準輸入從控制檯重定向,你有一個選擇:

打電話給你的程序是這樣的:

python3 ritwc.py -i your_file.txt 

,然後添加下面的代碼標準輸入從內部蟒蛇重定向,這樣就必須通過變量「filename_in」獲得的文件名:

import sys 

flag=0 
for arg in sys.argv: 
    if flag: 
     filename_in = arg 
     break 
    if arg=="-i": 
     flag=1 
sys.stdin = open(filename_in, 'r') 

#the rest of your code... 

如果你現在使用的合命令:

print(sys.stdin.name) 

你得到你的文件名;然而,當你從控制檯重定向標準輸入後執行相同的打印命令時,你會得到結果:<stdin>,這應該是python無法以這種方式查看文件名的證據。

1

您可以使用ArgumentParser,其中automattically爲您提供了命令行參數的接口,甚至提供幫助等

from argparse import ArgumentParser 
parser = ArgumentParser()                 
parser.add_argument('fname', metavar='FILE', help='file to process') 
args = parser.parse_args() 

with open(args.fname) as f: 
    #do stuff with f 

現在你罵python2 ritwc.py DarkAndStormyNight.txt。如果您撥打python3 ritwc.py而沒有參數,它會給出一個錯誤,說明它爲FILE預期的參數。您現在也可以撥打python3 ritwc.py -h,它會解釋需要file to process。這裏

PS是在如何使用它的一個偉大的介紹:http://docs.python.org/3.3/howto/argparse.html