使用 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脚本 - “$ @”和“$ *”之间有什么区别?

Bash 脚本无法识别命令行参数? [复制]

使用 --help 参数调用的 bash 脚本应该返回 0 还是非零退出代码? [关闭]

在 Bash 中使用 getopts 检索单个选项的多个参数

Bash 脚本:避免空字符串参数

带有命令行参数的 C++ 的 Makefile 和 Bash 脚本