8

我正在尝试获取命令行中给出的文件名。例如:

python3 ritwc.py < DarkAndStormyNight.txt

我正在尝试获取 DarkAndStormyNight.txt

当我尝试 fileinput.filename() 时,我得到了与 sys.stdin 相同的结果。这可能吗?我不是在寻找返回当前脚本名称的 sys.argv[0] 。

谢谢!

4

4 回答 4

6

通常,不可能以与平台无关的方式获取文件名。其他答案涵盖了明智的选择,例如在命令行上传递名称。

在 Linux 和一些相关系统上,您可以通过以下技巧获取文件名:

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

/proc/ 是 Linux 上的一个特殊文件系统,它提供有关机器上进程的信息。self表示当前正在运行的进程(打开文件的进程)。fd是一个目录,其中包含进程中每个打开文件描述符的符号链接。0 是 的文件描述符编号stdin

于 2013-03-07T04:29:52.250 回答
2

您可以使用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

于 2013-03-07T04:26:03.247 回答
1

事实上,当从控制台重定向标准输入时,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 无法以这种方式看到文件名。

于 2013-03-07T01:06:09.120 回答
0

我不认为这是可能的。就您的 python 脚本而言,它正在写入标准输出。您正在捕获写入 stdout 的内容并将其写入 shell 中的文件这一事实与 python 脚本无关。

于 2013-03-07T00:46:25.860 回答