在python脚本中,我想使用包含列表的bash脚本中的变量。
我这样做如下: 首先,我在bash脚本中创建了一个列表。另外,我将列表格式更改为python格式,最后导出列表:
#!/bin/bash
PYTHONPATH=$(which python)
TDATES="080201 080523 080905 090116 090515 090828 091211 100416 100730 101112
110311 110701 111014 120210 120601 120914 130111 130503 130809 131213
140404 140725"
echo $TDATES > datei.txt
sed "s/ /\\', \\'/g" datei.txt | sed "s/^/[\\'/g" | sed "s/$/\\']/g" > tdates.txt
TDP=$(cat tdates.txt)
export TDP
rm tdates.txt datei.txt
# exec python script
${PYTHONPATH} plot.py
'sed'命令将使格式从“080201 080523 ...”到['080201','080523','...',]。在python脚本中,我使用以下命令导入列表:
# plot.py
import os
TDATES = os.getenv('TDP')
print TDATES
屏幕输出如下:['080201','080523','...']哪个好,但 如果我尝试用
循环'TDATES'for i in TDATES:
print i
我会得到
[
'
0
8
0
2
0
1
'
,
而不是
080201
080523
...
我无法弄清楚我没注意到什么。感谢您的帮助!
答案 0 :(得分:0)
该行
TDATES = os.getenv('TDP')
将环境变量TDP
的值指定为TDATES
作为字符串。对字符串的迭代将一次进行一个字符,因此输出。举个例子:
>>> for c in "string":
... print c
...
s
t
r
i
n
g
您需要做的是将字符串TDATES
解析为Python列表,然后遍历该列表。一种方法是使用ast.literal_eval()
函数:
>>> from ast import literal_eval
>>> TDATES = literal_eval(os.getenv('TDP'))
>>> type(TDATES)
<type 'list'>
>>> for date in TDATES:
... print date
080201
080523
...
答案 1 :(得分:0)
不要改变TDATES,它在python中是完全可解析的。你的bash脚本看起来像这样:
#!/bin/bash
PYTHONPATH=$(which python)
TDATES="080201 080523 080905 090116 090515 090828 091211 100416 100730 101112
110311 110701 111014 120210 120601 120914 130111 130503 130809 131213
140404 140725"
export TDATES
# exec python script
${PYTHONPATH} plot.py
你的python脚本看起来像这样:
import os
TDATES = os.getenv('TDATES')
for i in TDATES.split(' '):
print i
另一种方法是不导出环境变量,并在bash脚本中将$TDATES
变量作为输入参数传递给python脚本:
${PYTHONPATH} plot.py ${TDATES}
然后在python中你会这样做:
import sys
for i in sys.argv[1:]
print i