Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将列表作为变量从bash脚本传递给python脚本_Python_Bash_Shell - Fatal编程技术网

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

将列表作为变量从bash脚本传递给python脚本,python,bash,shell,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.arg

我有一个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脚本时,我得到了
无效的参数数……
错误

我非常确定,这与
colu list
变量被传递到
python
脚本有关

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


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

问题来自于如何将包含空格的变量从
Bash
传递到
Python

你可能会注意到:

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

让我们看一下这个简单的
Python
脚本:

python\u 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']

有关更多信息,请参见此

您应该几乎总是在变量引用周围加上双引号(例如,
。${col_list}”“${FinalDB}”“${final_table}”“。
而不仅仅是
。${col colu list}${FinalDB}${final_table}…
)。这基本上是问题的重复:。