我有一个python脚本,它实际上做了一些测试并将结果写入文件。必须为此python文件提供参数列表:
myPc@myPc:~/Desktop/tests$ ./testScript.py --final fromTo 201983:310029 -o res.txt
每当我需要不同范围的新结果时,我必须手动完成它们,所以我决定编写一个bash脚本,如下所示:
#!/bin/bash
a=`wc -l < inFile.txt`
declare -a periods
declare -i index=0
echo "Number of Periods is: $a"
while IFS='' read -r line || [[ -n "$line" ]]; do
periods[$index]=$line
((index += 1))
done < "inFile.txt"
for ((i=0;i<1300;i++)); do
f1=${period[$i]}
f2=${period[$i+1]}
python testScript.py "--final fromTo $f1:$f2 -o res$i.txt"
done
#END
范围已经在文本文件中,所以我正在读取它们并将它们存储到数组中。
我希望每次使用不同范围的python脚本时都使用bash重新运行,直到涵盖所有范围,并且所有范围的所有结果都写在单独的文件中。但我面临一个问题,即我尝试传递给python的参数甚至都没有通过。我真的不明白这里的问题是什么。
"--final fromTo $f1:$f2 -o res$i.txt"
这是我要传递的参数,一旦完成,我将传递新的参数并再次运行但看起来它甚至没有看着它们
答案 0 :(得分:2)
参数的引用:
python testScript.py "--final fromTo $f1:$f2 -o res$i.txt"
导致整个字符串作为带有空格的单个参数传递给Python脚本。
删除引号(或至少将它们放在单词周围):
python testScript.py --final fromTo "$f1:$f2" -o "res$i.txt"
sys.argv
将正确填充,您的参数解析器将起作用(请注意argparse
默认情况下使用sys.argv
。)
作为一个小证明,test.py
脚本:
#!/usr/bin/env python
import sys
print(sys.argv)
现在尝试:
$ python test.py 1 2 3
['test.py', '1', '2', '3']
$ python test.py "1 2 3"
['test.py', '1 2 3']
与此无关,但为了完整起见,您的bash
脚本可以使用内置的mapfile
(又名readarray
进行简化,自bash
4.0以来可用):
#!/bin/bash
mapfile -t periods <inFile.txt
cnt="${#periods[@]}"
echo "Number of Periods is: $cnt"
for ((i=0; i<cnt; i++)); do
python testScript.py --final fromTo "${period[$i]}:${period[$i+1]}" -o "res$i.txt"
done
答案 1 :(得分:1)
您在命令行上键入的内容是六个字符串:&#34; ./ testScript.py&#34; &#34; - 最终&#34; &#34;的FromTo&#34; &#34; 201983:310029&#34; &#34; -o&#34; &#34; res.txt&#34;
$ cat args.py
#!/usr/bin/env python
import sys
print sys.argv
$ ./args.py --final fromTo 201983:310029 -o res.txt
['./args.py', '--final', 'fromTo', '201983:310029', '-o', 'res.txt']
当您在最后四个字符串周围放置双引号时,会强制shell将它们视为单个字符串。不是Python的错。
./args.py "--final fromTo 201983:310029 -o res.txt"
['./args.py', '--final fromTo 201983:310029 -o res.txt']
只需将引号放在必须作为单个字符串处理的项目周围:
$ f1=201983; f2=310029; i=1
$ ./args.py --final fromTo "$f1:$f2" -o "res$i.txt"
['./args.py', '--final', 'fromTo', '201983:310029', '-o', 'res1.txt']