我试图获取命令行给出的文件名。例如: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