【问题标题】:How to pass the Python variable to c shell script如何将 Python 变量传递给 c shell 脚本
【发布时间】:2014-10-14 17:11:27
【问题描述】:

我在 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

【问题讨论】:

  • 与任何其他使用子进程调用的 shell 一样。这是 99.9% 的重复。
  • 为什么你的代码会互相调用?这将导致无限的子壳(递归)。
  • @alvits:我的代码没有互相调用。我在 Python 脚本中调用 Shell 脚本,只是将 Python 代码中的变量传递给 shell 脚本。
  • @luk32: 没有得到 99.9% 的重复率。您介意详细说明吗?
  • @nprak - 然后你有无限的子壳(递归)。这就是为什么。 raw2waveconvert.py 通过subprocess.call() 调用test1.cshtest1.csh 通过$() 调用/home/nishant/workspace/codec_implement/src/NTTool/raw2waveconvert.py 以将stdout 分配给nvar。当raw2waveconvert.py 执行时,它将通过subprocess.call() 调用test1.csh,而subprocess.call() 又调用raw2waveconvert.py。它永远不会结束。

标签: python csh


【解决方案1】:

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

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

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,我就不讨论了,但我不喜欢,不鼓励。提供的示例应该有效且安全。

【讨论】:

  • 非常感谢,它成功了。但是,我只想知道你们是从哪里学到这些东西的,我在书上找不到这些。说真的,肯定有一些资源可以解释这些事情。
  • 谷歌"call shell script from python"。点击第一个链接。单击第一个答案中的第一个链接。阅读文档
  • 我想知道如果我需要将从组合框中选择的整数值传递给 shell 怎么办
【解决方案2】:
subprocess.call(..., env=os.environ + {'num': num})

【讨论】:

  • 你是说这个吗:subprocess.call(["csh", "./test1.csh",], env=os.environ + {'num': num})
【解决方案3】:

在这里做你想做的唯一方法是通过 shell 环境导出/传递变量值。这需要使用 env={} 字典参数。

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

【讨论】:

  • 没有所谓的“shell环境”;环境变量不是特定于 shell 的。
  • @IgnacioVazquez-Abrams 他正在运行的 shell 进程的环境是使他试图存在的变量存在于他正在运行的脚本中的唯一方法。因此是“外壳环境”。虽然您的评论确实让我意识到 shell=True 在这里几乎肯定不需要。
  • @IgnacioVazquez-Abrams 是的,这将是他正在运行的 shell 的环境。这是我的观点。 shell's environment 会让你更快乐吗?