Jim*_*Jim 9 python linux arrays bash
我正在尝试使用旧的getenv方法将数组从bash传递给python但是我一直收到此错误:
./crcFiles.sh: line 7: export: `0021': not a valid identifier
Traceback (most recent call last):
File "/shares/web/vm3618/optiload/prog/legalLitres.py", line 30, in <module>
for i in mdcArray.split(' '):
AttributeError: 'NoneType' object has no attribute 'split'
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么$ mdcNo没有成功从bash传递到python吗?
代码.sh:
#!/bin/bash
mdcNo=('0021' '0022' '0036' '0055' '0057' '0059' '0061' '0062' '0063' '0065' '0066' '0086' '0095' '0098' '0106' '0110' '0113' '0114' '0115' '0121' '0126' '0128' '0135' '0141' '0143' '0153' '0155' '0158')
localDIR=/shares/web/vm3618/optiload/prog
export mdcNo
$localDIR/legalLitres.py
for i in "${mdcNo[@]}"
do
echo $i
cp $localDIR/MDC$i/*/QqTrkRec.txt $localDIR/crccalc/.
cd $localDIR/crccalc
./crccalc.py QqTrkRec.txt
cp $localDIR/crccalc/QqTrkRec.txt $localDIR/MDC$i/.
done
Run Code Online (Sandbox Code Playgroud)
代码.py:
#!/usr/bin/python
import glob
import os
mdcArray = os.getenv('mdcNo')
#Legal Litres that hex and decimal
legalLitresHex = "47E0"
legalLitresTxt = '18,400'
# file name and Legal Litres header
legalHeader = ":00F0:"
hexFile = "QqTrkRec.txt"
# insert comment to explain change
comment = "#\n# 2015 Nov 20: Legal Litres changed to 18,400\n#\n"
commentFlag0 = "# SetDATA"
commentFlag1 = "# SetDATA"
try:
for i in mdcArray.split(' '):
line = ""
Qqfile = glob.glob("/shares/web/vm3618/optiload/prog/MDC"+i+"/*/"+hexFile)
outFile = Qqfile[0]+".new"
print i
Run Code Online (Sandbox Code Playgroud)
Mar*_*eed 14
当你export从shell变量时,你真正在做的是将它添加到所有子进程继承的POSIX"environment"数组中.但POSIX环境是一个名称=值字符串的平面数组; 它本身不能包含数组.所以Bash甚至没有尝试将数组放在那里.它将为您提供export一个数组变量,这样做甚至可以在该变量上设置"exported"标志,但不会触及环境.您可以通过运行env或bash查找"已导出"变量的新副本来验证此事实:
$ export myArr=(this is an array)
$ bash -c 'echo "${myArr[@]}"'
$
Run Code Online (Sandbox Code Playgroud)
(其他一些具有shell的数组,特别是ksh,实际上会将数组变量导出到环境中,但导出的值只包含数组的第一个元素.)
如果要将shell数组传递给Python脚本,最好将其作为命令行参数.如果你像这样运行Python脚本:
python code.py "${mdcNo[@]}"
Run Code Online (Sandbox Code Playgroud)
...然后Python代码可以循环sys.argv,这总是一个列表.(具体来说,传入的数组将是切片sys.argv[1:],因为sys.argv[0]总是设置为脚本本身的名称.)
如果这不是一个选项,那么你必须将环境变量设置为一个字符串,在元素之间有一些分隔符并将其拆分在Python代码中.像这样的东西......
击:
export mdcList='0021,0022,0036,0055,0057,0059,0061,0062,0063,0065,0066,0086,0095,0098,0106,0110,0113,0114,0115,0121,0126,0128,0135,0141,0143,0153,0155,0158'
Run Code Online (Sandbox Code Playgroud)
或者您可以从数组中构建字符串:
export mdcList=${mdcNo[0]}
for i in "${mdcNo[@]:1}"; do
mdcList+=,$i
done
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,Python脚本都可以像这样的列表恢复数组:
mdc_no = os.getenv('mdcList').split(',')
Run Code Online (Sandbox Code Playgroud)
如果你的数组元素不仅仅是数字,你可以用不太可能出现在元素中的东西替换逗号; 传统的选择是ASCII单元分隔符(U + 001F,$'\x1f'在Bash中,'\x1f'在Python中).
我认为 Mark Reed 已经给了你很好的解释和解决方案。不过,您是否考虑过使用 python 的argparse?
#!/usr/bin/env python
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('stuff', nargs='+')
args = parser.parse_args()
print args.stuff
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
用:
$ mdcNo=('0021' '0022' '0036' '0055' '0057' '0059' '0061' '0062' '0063' '0065' '0066' '0086' '0095' '0098' '0106' '0110' '0113' '0114' '0115' '0121' '0126' '0128' '0135' '0141' '0143' '0153' '0155' '0158')
$ python argp.py "${mdcNo[@]}"
['0021', '0022', '0036', '0055', '0057', '0059', '0061', '0062', '0063', '0065', '0066', '0086', '0095', '0098', '0106', '0110', '0113', '0114', '0115', '0121', '0126', '0128', '0135', '0141', '0143', '0153', '0155', '0158']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7680 次 |
| 最近记录: |