Python 2.7 如何让用户在命令行程序中指示目录的文件路径?

Python 2.7 如何让用户在命令行程序中指示目录的文件路径?,python-2.7,argparse,Python 2.7,Argparse,我正在开发一个命令行程序,要求用户为名称空间对象指示许多参数,而我现在不确定如何设计一个参数,允许用户指示目录的文件路径,该目录将包含程序运行所需的一些文本文件 因为我试图使这个命令行程序可移植(即它可以在Linux、Mac和Windows上工作),我不确定应该如何设计参数以允许来自不同平台的用户指示其相关的文件路径,因为Windows中的文件路径必须使用反斜杠,而不是Mac或Linux中的文件路径 我应该如何着手设计如下所示的论点 import argparse from os import

我正在开发一个命令行程序,要求用户为名称空间对象指示许多参数,而我现在不确定如何设计一个参数,允许用户指示目录的文件路径,该目录将包含程序运行所需的一些文本文件

因为我试图使这个命令行程序可移植(即它可以在Linux、Mac和Windows上工作),我不确定应该如何设计参数以允许来自不同平台的用户指示其相关的文件路径,因为Windows中的文件路径必须使用反斜杠,而不是Mac或Linux中的文件路径

我应该如何着手设计如下所示的论点

import argparse
from os import path

Parser = argparse.ArgumentParser(prog= "Parser")
Parser.description= "This program helps with stuff blah blah blah"

Parser.add_argument("-input_dir", help= "Please indicate the file path that points to the location of the input text files.")

Parser.add_argument("-input_text", help= "Please indicate the specific text file you want to analyze.")

args= Parser.parse_args()

file_path= args.input_dir
text_file= path.join(file_path, args.input_text)
附录

我应该注意到,我试图实现的是允许用户使用其他参数在命令行中键入他们的文件路径,以便他们的输入看起来像:

python testcript.py -input_dir ~/Documents/Input_Directory -input_text somefile.txt

并且仍然可以在多个平台上工作

您可以使用
os.path.join(input_dir,“file1.txt”)
来处理所有特定于操作系统的问题。已正确初始化解析器,请使用输入目录和
os.path.join
以及
os.path.exists
打开输入文件

引用参考文献:

由于不同的操作系统具有不同的路径名约定,因此标准库中有多个版本的此模块。path模块始终是适合Python运行的操作系统的路径模块,因此可用于本地路径。但是,如果要操纵始终采用不同格式之一的路径,也可以导入和使用各个模块


您可以使用
os.path.join(input_dir,“file1.txt”)
,它将处理所有特定于操作系统的问题。已正确初始化解析器,请使用输入目录和
os.path.join
以及
os.path.exists
打开输入文件

引用参考文献:

由于不同的操作系统具有不同的路径名约定,因此标准库中有多个版本的此模块。path模块始终是适合Python运行的操作系统的路径模块,因此可用于本地路径。但是,如果要操纵始终采用不同格式之一的路径,也可以导入和使用各个模块

你真的想得太多了。听起来问题的核心是缺乏信心,
os.path
实际上可以跨平台工作。让我向你保证,是的!这个模块已经存在了27年(!),可以在Windows和UNIX上正常工作

与其假设某些东西不起作用,然后先发制人地寻找解决办法(这可能涉及重新发明轮子),不如测试它,看看它是否起作用。在未来,这将省去很多对非问题的担忧

在其中一条评论中,您表达了对能够以跨平台的方式将文件名与目录分离的担忧,这就是为什么您希望用户独立提供文件名的原因。这是错误的想法。实现这一点的明智方法是从用户那里获取完整路径,然后自己打破它(如果没有必要,用户讨厌做额外的工作)

使用此设置,用户可以选择提供完整路径、相对路径或仅提供文件名本身,并且它将始终有效!在任何文件系统上

% python2 parse.py -text-file ~/directory/file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% python2 parse.py -text-file /home/smmorton/directory/file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% python2 parse.py -text-file directory/file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% cd ~/directory
% python2 parse.py -text-file file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% python2 parse.py -text-file ../directory/./file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

如果您使用的是Python>=3.4,我建议您使用而不是
os.path

您已经认真考虑过了。听起来问题的核心是缺乏信心,
os.path
实际上可以跨平台工作。让我向你保证,是的!这个模块已经存在了27年(!),可以在Windows和UNIX上正常工作

与其假设某些东西不起作用,然后先发制人地寻找解决办法(这可能涉及重新发明轮子),不如测试它,看看它是否起作用。在未来,这将省去很多对非问题的担忧

在其中一条评论中,您表达了对能够以跨平台的方式将文件名与目录分离的担忧,这就是为什么您希望用户独立提供文件名的原因。这是错误的想法。实现这一点的明智方法是从用户那里获取完整路径,然后自己打破它(如果没有必要,用户讨厌做额外的工作)

使用此设置,用户可以选择提供完整路径、相对路径或仅提供文件名本身,并且它将始终有效!在任何文件系统上

% python2 parse.py -text-file ~/directory/file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% python2 parse.py -text-file /home/smmorton/directory/file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% python2 parse.py -text-file directory/file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% cd ~/directory
% python2 parse.py -text-file file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt

% python2 parse.py -text-file ../directory/./file.txt
/home/smmorton/directory/file.txt
/home/smmorton/directory
file.txt


如果您使用的是Python>=3.4,我建议您使用而不是
os.path

您也可以在windows上使用单正斜杠查看
sys.argv
以查看shell如何将命令行转换为字符串列表。这就是
argparse
必须处理的问题。有时命令行需要转义字符或引号来绕过自己的解析。正如所写的,您的代码将在多个平台上工作。您是否在询问如何(例如)在UNIX或Windows上将
~
扩展到
/home/user
C:\\user
?能否解释一下
sys.argv
和输入命令行的字符串列表是如何连接的?当我在IDE提示符中键入它时,它会给出
['-c'、'-f'、'/var/folders/03/32bw0xmn3c59_9wn5tyrm2t0000gn/T/tmpshomvv.json'、'-pylab=qt']
,这似乎与我的命令行程序根本没有关联。@SethMMorton这或多或少就是我要问的,是的。此时,用户可以输入input directory参数
-input\u dir/home/user/Documents/input\u dir
,它只会工作