如何将参数传递给将使用bash脚本运行的python脚本?

时间:2017-10-27 18:44:30

标签: python bash

我有一个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"

这是我要传递的参数,一旦完成,我将传递新的参数并再次运行但看起来它甚至没有看着它们

2 个答案:

答案 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']