我在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
答案 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的bash
和csh
。
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
,我不会讨论它,但我不喜欢并且不鼓励它。提供的示例应该有效且安全。