[英]Passing a list as variable to python script from bash script
我有一个 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
变量而不是在列表中包含列,那么我不会收到任何错误
我在这里做错了什么,我该如何解决这个问题。
问题来自您如何将包含空格的变量从Bash
到Python
。
你可能会注意到:
在 shell 脚本中,命令行 arguments 由空格分隔,除非引用了 arguments。
让我们有这个简单的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']
有关更多信息,请参阅本文
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.