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

时间:2020-05-17 22:50:35

标签: 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......错误

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

如果我只是在查询中传递select *并删除col_list变量,则不会在列表中有列,那么我不会出现任何错误

我在这里做错什么,如何解决此问题。

1 个答案:

答案 0 :(得分:3)

问题出在您如何传递包含从BashPython的空格的变量。

您可能会注意到:

在shell脚本中,命令行参数由 空格,除非参数用引号引起。

让我们使用这个简单的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 args作为字符串传递,即使有空格也是如此,例如以下示例:

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

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