我正在尝试获取命令行中给出的文件名。例如:
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
。
您可以使用ArgumentParser
,它会自动为您提供带有命令行参数的界面,甚至提供帮助等
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
,它会说明 afile to process
是必需的。
PS这里是如何使用它的一个很好的介绍:http: //docs.python.org/3.3/howto/argparse.html
事实上,当从控制台重定向标准输入时,python 无法看到该文件名,因此您有一个替代方案:
像这样调用你的程序:
python3 ritwc.py -i your_file.txt
然后添加以下代码以从 python 内部重定向标准输入,以便您可以通过变量“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 无法以这种方式看到文件名。
我不认为这是可能的。就您的 python 脚本而言,它正在写入标准输出。您正在捕获写入 stdout 的内容并将其写入 shell 中的文件这一事实与 python 脚本无关。