python - 将列表作为变量从 bash 脚本传递给 python 脚本

标签 python bash shell

我有一个如下所示的 python 脚本。

# Import necessary libraries and functions
import sys
import traceback

y = '2020'
querysting = "select {} from table where Year={}".format(col_list,y)
df = pd.read_sql(querystring,db)


if __name__ == '__main__':
    if len(sys.argv) != 8:
        print('Invalid number of args......')
        print('Usage: file.py Input_path Output_path')
        exit()
    _, col_list, FinalDB, final_table, host, dsl_tbl_name, username, password = tuple(sys.argv)

    data_load(col_list, FinalDB, final_table, host, tbl_name, username, password)

现在我在 shell 脚本中调用这个 python 脚本,如下所示

#!/bin/bash

col_list='id, name, address, phone_number'
FinalDB='abc'
final_table='xyz'
host='xxxxxx.xxxx'
tbl_name='test'
username='USER'
password='test_pass'


python python_script.py ${col_list} ${FinalDB} ${final_table} ${host} ${tbl_name} ${username} ${password}

现在,当我运行这个 bash 脚本时,我收到 Invalid number of args...... 错误

我非常确定这与传递给 python 脚本的 col_list 变量有关。

因为如果我只是在查询中传递 select * 并删除 col_list 变量,而不是在列表中包含列,那么我不会收到任何错误

我在这里做错了什么以及如何解决这个问题。

最佳答案

问题出在如何将包含空格的变量从 Bash 传递到 Python

您可能会注意到:

In shell scripts command line arguments are separated by whitespace, unless the arguments are quoted.

让我们使用这个简单的 Python 脚本:

python_script.py:

import sys

if __name__ == '__main__':
    print(sys.arv)

然后在您的终端中:

$> export var1="hello"
$> python python_script.py $var1
['python_script.py', 'hello']

但是:

$> export var1="hello, hi"
$> python python_script.py $var1
['python_script.py', 'hello,', 'hi']  # Note Here: Two args were passed
$> export var1="hello,hi"
$> python python_script.py $var1
['python_script.py', 'hello,hi']  # One arg passed

因此,解决您问题的方法是将您的 Bash 参数作为字符串传递,即使带有空格,如下例所示:

$> export var1="hello, hi, hola"
$> python python_script.py "$var1"
['python_script.py', 'hello, hi, hola']

有关更多信息,请参阅此 article

关于python - 将列表作为变量从 bash 脚本传递给 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61859812/

相关文章:

linux - 漂亮的 shell 脚本(菜单、图像、抗锯齿、1080p、颜色、淡入淡出效果等)?

linux - 使用 Fabric 重命名远程服务器上的目录

python - Numpy unique 具有预期的唯一值

mysql - 大数据文件、操作和搜索

linux - bash getopts 验证选项

linux - 菜单和子菜单,然后返回到Linux上的菜单脚本

linux - 检查 rsync 命令是否运行成功

python - PyTorch 自定义转换,在 __call__ 中带有附加参数

python - Python中按字节长度分割字符串

javascript - 类型错误 : 'Undefined' object is not iterable?