如何将Python变量传递给C Shell脚本

0 投票
3 回答
2191 浏览
提问于 2025-04-27 13:33

我正在使用Centos 7.0和Eclipse中的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

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有些人可能在使用某个工具或库的时候,发现它的功能没有达到预期。这种时候,我们可以去网上寻找答案,比如在StackOverflow这样的论坛上提问或者查找相关的讨论。

在这些讨论中,大家会分享自己的经验和解决方案,帮助彼此解决问题。通常,问题的描述会很详细,包含了出错的代码和错误信息,这样其他人才能更好地理解问题所在。

总之,当你在编程时遇到困难,不妨去看看别人是怎么解决类似问题的,或者直接向社区求助,通常会得到很好的建议和帮助。

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

你想要的事情,唯一的办法就是通过 shell 环境来传递变量的值。这需要用到 env={} 这个字典参数。

不过,更好的做法其实是给你的脚本传递参数,而不是假设已经有某些变量存在。这样的话,你可以把 num 放进 subprocess.call 的数组参数里(如果你不确定脚本会不会失败,最好用 check_call)。然后就可以像平常一样使用 $1 等等。

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脚本,不过根据我所了解,命令行变量的处理方式是一样的,所以在默认的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,我不想讨论这个,但我不喜欢并且不推荐这种做法。这里展示的例子应该是有效且安全的。

撰写回答