2013-03-07 70 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