使用 bash 脚本时使用文件名参数调用 Python 脚本
Posted
技术标签:
【中文标题】使用 bash 脚本时使用文件名参数调用 Python 脚本【英文标题】:Call Python script with filename argument when using bash script 【发布时间】:2021-04-03 18:06:38 【问题描述】:我正在尝试通过调用我的 Python 脚本的 Bash Shell 脚本 (csv
) 运行我的 Python 脚本 (csv_builder.py
)。在脚本中,我请求输入文件名。
bash 脚本如下:
chmod +x D:/Users/michaeld/Python/csv_builder/csv_builder.py
python3 D:/Users/michaeld/Python/csv_builder/csv_builder.py
调用输入的 Python 脚本的开头如下:
#!/usr/bin/python
import sys
import argparse
parser = argparse.ArgumentParser(description = 'This inputs the .csv file')
parser.add_argument('--i', required = True, type = str, help = '.csv filename')
args = parser.parse_args()
csv_name = args.i
# csv_name = input('\nEnter the .csv file name: \n') This was the original input
我一直在尝试在命令行上运行,但出现错误:the following arguments are required: --i
:
csv --i file_name.csv
我希望能够在运行 Bash Shell 脚本 (csv
) 时在命令行中定义该文件名输入。有一个更好的方法吗?如果我可以直接输入csv file_name.csv
,那就太理想了。
【问题讨论】:
你为什么不直接从命令行调用python3 ...csv_builder.py --i file_name.csv
?还是在shell脚本的第二行加上--i file_name.csv
?
顺便说一句,当您使用 python3 ...csv_builder.py
显式调用 Python 脚本时,不需要使 Python 脚本可执行
我正在尝试使脚本可用于许多不同类型的 .csv 文件名。此外,为了不必每次都输入整行,我只想调用 bash 脚本名称。至于可执行文件……那什么时候需要呢?当我调出整个路径时,我只能让脚本工作。
当我在同一个文件夹中运行 python3 csv_builder.py --i file_name.csv 时它可以工作,但是当我尝试使用我的 bin 文件夹中的 bash 脚本时,它给了我错误。如何修复我的 bash 脚本以使用 argparse?
当你定义一个带有'-i'标志的参数时,你必须在命令行(或脚本调用)中使用它。文件名不够。但是您可以创建一个 positional
参数。 argparse 文档应该对此很清楚。
【参考方案1】:
我无法重现该问题:
$ ./csv --i file_name.csv
$ ./csv --i
usage: csv [-h] [--i I]
csv: error: argument --i: expected one argument
尝试使用./csv
运行您的文件,这样您就可以确定您正在执行正确的文件。
【讨论】:
我意识到我的论点有“required = True”这个论点。我得到的错误是 csv.py:错误:需要以下参数:--i。为什么它看不到我的文件名参数?【参考方案2】:# csv.py
import argparse
parser = argparse.ArgumentParser(description='This inputs the .csv file')
parser.add_argument('filename', type=str, help='.csv filename')
args = parser.parse_args()
print(args.filename)
使用python csv.py file_name.csv
运行
【讨论】:
以上是关于使用 bash 脚本时使用文件名参数调用 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章
解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?
使用 --help 参数调用的 bash 脚本应该返回 0 还是非零退出代码? [关闭]