我試圖獲取命令行給出的文件名。例如:Python stdin文件名
python3 ritwc.py < DarkAndStormyNight.txt
我試圖讓DarkAndStormyNight.txt
當我嘗試fileinput.filename()我得到SYS回到同一.stdin。這可能嗎?我不是在尋找返回當前腳本名稱的sys.argv [0]。
謝謝!
我試圖獲取命令行給出的文件名。例如:Python stdin文件名
python3 ritwc.py < DarkAndStormyNight.txt
我試圖讓DarkAndStormyNight.txt
當我嘗試fileinput.filename()我得到SYS回到同一.stdin。這可能嗎?我不是在尋找返回當前腳本名稱的sys.argv [0]。
謝謝!
一般這是不可能獲得一個平臺無關的方式的文件名。其他答案涵蓋了合理的選擇,例如在命令行上傳遞名稱。
在Linux,以及一些相關的系統,您可以通過下面的技巧獲取文件的名稱:
import os
print(os.readlink('/proc/self/fd/0'))
/proc
/是在Linux上一個特殊的文件系統,提供有關本機進程的信息。 self
表示當前正在運行的進程(打開文件的進程)。 fd
是包含進程中每個打開文件描述符的符號鏈接的目錄。0是stdin
的文件描述符編號。
我不認爲這是可能的。就你的python腳本而言,它正在寫入stdout。事實上,你正在捕獲寫入標準輸出並將其寫入文件到shell中與python腳本無關。
事實上,因爲它縫了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無法以這種方式查看文件名的證據。
您可以使用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
嗨nneonneo,你知道爲什麼我的ubuntu的確有路徑'/ proc/self/fd/0',但是當我做'./test.py
8090PZ
2015-04-28 01:16:31