使用bash脚本将参数传递给python脚本

时间:2015-03-11 23:19:07

标签: python bash for-loop

我有一个非常基本的问题,但我对python的了解非常有限。我有一个python脚本,它需要几个参数才能运行(https://github.com/raphael-group/hotnet2/blob/master/bin/createPPRMat.py)。

我想使用带有一些文件名的文件(每行一个)作为第一个传递给python脚本的参数。

我的第一次尝试是创建一个bash脚本(mat.sh),如下所示:

#!/bin/bash
for net in $(cat /home/hotnet2-1.0.0/iref/iref.list);
do
export
python createPPRMat.py -e `$net` -i /home/jfertaj/hotnet2-1.0.0/iref/iref_index_genes -o /home/jfertaj/Broad_Stay/hotnet2-1.0.0/iref_influence_matrices
done

但是我收到错误,python脚本似乎没有解析$net变量:

createPPRMat_1.py: error: argument -e/--edgelist_file: expected one argument
mat.sh: line 6: /home/jfertaj/Broad_Stay/hotnet2-1.0.0/iref/iref_edgelist_139: No such file or directory

当我在bash脚本(net)中双引号变量"$net"时,我得到的错误是不同的,指出文件名出错了

Traceback (most recent call last):
File "/home/jfertaj/Broad_Stay/hotnet2-1.0.0/bin/createPPRMat_1.py", line 96, in <module>
run(get_parser().parse_args(sys.argv[1:]))
File "/home/hotnet2-1.0.0/bin/createPPRMat_1.py", line 38, in run
edges = [map(int, l.rstrip().split()[:2]) for l in open(args.edgelist_file)]
IOError: [Errno 2] No such file or directory: '\x1b[01;00m/home/hotnet2-1.0.0/iref/iref_edgelist_164\x1b[0m'

iref.list的内容如下所示:

/home/hotnet2-1.0.0/iref/iref_edgelist_1
/home/hotnet2-1.0.0/iref/iref_edgelist_10
/home/hotnet2-1.0.0/iref/iref_edgelist_100

iref.list文件是使用cat -1 ... < iref.list

创建的

非常感谢任何帮助

由于

1 个答案:

答案 0 :(得分:2)

python traceback会显示问题(正如您所注意到的那样)。

Traceback (most recent call last):
File "/home/jfertaj/Broad_Stay/hotnet2-1.0.0/bin/createPPRMat_1.py", line 96, in <module>
run(get_parser().parse_args(sys.argv[1:]))
File "/home/hotnet2-1.0.0/bin/createPPRMat_1.py", line 38, in run
edges = [map(int, l.rstrip().split()[:2]) for l in open(args.edgelist_file)]
IOError: [Errno 2] No such file or directory: '\x1b[01;00m/home/hotnet2-1.0.0/iref/iref_edgelist_164\x1b[0m'

该文件不是文本文件。它是一个二进制文件。它包含文件名和shell颜色代码。您需要删除(或过滤掉)这些颜色代码,然后才能逐字使用文件名(或者获取文件的干净副本,并修复任何进程向文件吐出颜色代码以停止执行此操作)。

使用反引号时得到的不同错误(缺少参数)是因为反引号将其内容作为命令运行。所以`$net`获取$net变量的值并尝试将其作为shell命令运行,然后用该命令的输出替换整个反引号引用的字符串。

这就是为什么你得到&#34;没有这样的文件或目录&#34;那里的错误(因为带有代码的文件名无效),以及随后-e标志没有参数的原因(反引号字符串被评估为空字符串,所以你最终得到{{ 1}}并且-e -i没有参数。)