如何从bash脚本传递变量参数给python脚本

16

我已经尝试解决这个问题有一段时间了,但没有成功。情况的核心是我使用一个bash脚本向python脚本发送参数:

例如:

foo.sh调用bar.py……调用看起来像: bar.py $var1 $var2 ... $varn

然后Python脚本使用sys.argv数组打印所有参数。当在命令行中正确运行Python脚本时,但是当从bash脚本(i.e foo.sh)调用时,则无任何输出。

此外,我使用“#!/bin/bash -x”选项启动了foo.sh,并观察了输出。

总结一下:

  • 两个脚本,foo.sh和bar.py
  • foo.sh 调用bar.py,并将foo.sh的变量作为参数传递给bar.py
  • bar.py使用sys.argv打印它看到的参数
  • bar.py在自己的终端中运行时可以工作,但从foo.sh调用时无法工作

任何帮助都会很棒!

谢谢!

编辑:大家好,感谢回复,完整代码非常长...但是...两个脚本的内容可以总结如下

foo.sh ____

#!/bin/bash
declare -a list1;  
declare -a list2;  

list1=("foo" "bar" "please");  
list2=("foo" "bar" "please" "help");  

declare -a joined;  

joined=( $(bar.py "${list1[@]}" "${list2[@]}" ) );

bar.py ____

#!/bin/python
import sys  

for arg in sys.argv:  
    print arg  

我假设Python中所有的缩进都是正确的(还不确定StackOverflow是如何做到这一点的:))。这两个问题是我遇到的核心问题。正如所述,当没有从foo.sh调用时,bar.py会正确打印参数。

PS:我确实想说“crust”


1
请发布实际的Bash脚本,这将使查看问题变得更容易。 - tobyodavies
2
那你做错了什么。发布最小的代码以展示问题。 - Ignacio Vazquez-Abrams
3
也就是说:我认为你的意思是情况的“关键点”哈哈。 - intuited
@intuited,是的,Python脚本可以打印我想要的任何内容,包括从命令行传递的参数... 我确实是想说“crust” lol - certifiedNoob
@birryree,这正是我编写的脚本中代码的样子...将值保存在两个数组中,不包含双引号...不确定这是否与问题有关... - certifiedNoob
显示剩余7条评论
3个回答

6

编辑,因为代码已经发布

你的代码正在做正确的事情 - 除了你的 bar.py 脚本输出被捕获到数组 joined 中。由于看起来你没有打印出 joined 的内容,所以你永远不会看到任何输出。

这里是一个演示:

文件 pybash.sh

#!/bin/bash

declare -a list1
declare -a list2

list1=("Hello" "there" "honey")
list2=("More" "strings" "here")

declare -a joined

joined=($(./pytest.py ${list1[@]} ${list2[@]}))
echo ${joined[@]}

文件 pytest.py

#!/usr/bin/python

import sys

for i in sys.argv:
    print "hi"

如果你运行这个bash脚本,它会输出很多“hi”字符串。

@birryee,是的,脚本具有+x权限...不确定第一个问题在问什么... - certifiedNoob

1

编辑:

我解决了,我有一些奇怪的字符组合,这行代码没有被正确转义。我将它从

var=( $( some commands) )

改为

var=( some commands ) // 使用反引号(还在学习 SO 编辑器...)

Bash 转义真是一场旅程啊!感谢所有回答我的人。


-2

我基本上拥有你所描述的完全相同的设置,这是我的bash脚本的外观:

VAR1=...
VAR2=...
VAR3=...

python my_script.py $VAR1 $VAR2 $VAR3 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接