【问题标题】:use bash script to pass arguments to a python script使用 bash 脚本将参数传递给 python 脚本
【发布时间】:2015-05-13 23:39:39
【问题描述】:

我有一个非常基本的问题,但是我对 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 ... &lt; iref.list 创建的

任何帮助将不胜感激

谢谢

【问题讨论】:

  • '\x1b[01;00m/home/hotnet2-1.0.0/iref/iref_edgelist_164\x1b[0m' 输出中的 this 看起来文件中包含颜色控制代码。那不是文本文件。您需要获取一个干净的文本文件或将其删除,然后才能使用。
  • 好的,我了解颜色控制代码,但是为什么当我使用$net 时,我得到的错误是不同的?好吧,也许这是一个非常愚蠢的问题......
  • 反引号将其内容作为命令运行。所以`$net` 获取$net 变量的值并尝试将其作为shell 命令运行,并将反引号字符串替换为命令的输出。这就是为什么你会在那里得到“没有这样的文件或目录”错误以及为什么 -e 参数没有参数(反引号字符串计算为空字符串)。
  • 感谢@EtanReisner 的帮助和信息,删除控制代码就可以了。如果您发布 cmets 是一个答案,我将非常乐意给您积分

标签: python bash for-loop


【解决方案1】:

python 回溯向您展示了问题(正如您所注意到的)。

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'

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

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

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

【讨论】: