如何将Python变量传递给c shell脚本

时间:2014-10-14 17:11:27

标签: python csh

我在Eclipse中使用Centos 7.0和PyDEv。我试图将Python中的变量传递给c shell脚本。但是我收到了错误:

这是我的Python脚本,名为raw2waveconvert.py

num = 10
print(num)
import subprocess
subprocess.call(["csh", "./test1.csh"])

运行Python脚本时的输出/错误:

10

num: Undefined variable.

文件test1.csh包含:

#!/bin/csh
set nvar=`/home/nishant/workspace/codec_implement/src/NTTool/raw2waveconvert.py $num` 
echo $nvar

3 个答案:

答案 0 :(得分:0)

subprocess.call(..., env=os.environ + {'num': num})

答案 1 :(得分:0)

在此处执行所需操作的唯一方法是通过shell环境导出/传递变量值。这需要使用env={}字典参数。

但是你应该做的更有可能是将参数传递给你的脚本,而不是假设预先存在的变量。然后你会把num放在数组参数中subprocess.call(可能更好地使用check_call,除非你知道脚本应该失败),然后使用$1 / etc。照常。

答案 2 :(得分:0)

好吧,显然,找到一个漂亮而清晰的副本并不是那么容易。这就是它通常的做法。您可以将值作为参数传递给脚本,也可以通过环境变量传递。

以下示例显示了两种方法。当然,你可以放弃任何你不喜欢的东西。

import subprocess
import shlex

var = "test"
env_var = "test2"
script = "./var.sh"

#prepare a command (append variable to the scriptname)
command = "{} {}".format(script, var)
#prepare environment variables
environment = {"test_var" : env_var}

#Note: shlex.split splits a textual command into a list suited for subprocess.call
subprocess.call( shlex.split(command), env = environment )

这是相应的bash脚本,但是从我读过的处理命令行变量是相同的,因此它应该适用于设置为默认shell的bashcsh

var.sh

#!/bin/sh

echo "I was called with a command line argument '$1'"
echo "Value of enviormental variable test_var is '$test_var'"

测试:

luk32$ python3 subproc.py 
I was called with a command line argument 'test'
Value of enviormental variable test_var is 'test2'

请注意,python解释器需要具有对被调用脚本的适当访问权限。在这种情况下,var.sh需要为用户luk32执行。否则,您将收到Permission denied错误。

我还强烈要求阅读subprocess上的文档。许多其他材料使用shell=True,我不会讨论它,但我不喜欢并且不鼓励它。提供的示例应该有效且安全。