从python子进程模块启动module shell命令

时间:2011-08-19 14:37:28

标签: python bash subprocess environment-modules

我正在尝试运行vnc服务器,但为了首先执行此操作,我需要运行'module load vnc'。

如果我在加载的bash shell中调用which module,则找不到的命令是PATH,但同时它可用。看起来命令是内置的。

换句话说,我看起来需要同时执行两个命令module load vnc;vncserver :8080 -localhost而我正在编写脚本以从python启动它。 我尝试了subprocess.Popen之类的

的不同变体
subprocess.Popen('module load vnc;vncserver :8080 -localhost', shell=True) 

返回127退出代码或command not found

subprocess.Popen('module load vnc;vncserver :8080 -localhost', shell=False)

显示

File <path>/subprocess.py line 621, in \__init__    
                                   errread, errwrite)
OSError: [Errno 2] No such file or directory.

如果我指定shell=True,则会从/bin/sh执行,但我需要/bin/bash

指定executable='/bin/bash'没有帮助,因为它加载了新的bash shell但是它以字符串而不是作为进程启动,即我在ps列表中看到了与我想要启动的命令完全相同的命令。 / p>

请问您如何从子进程模块启动此命令?是否可以以shell=False开始?

3 个答案:

答案 0 :(得分:2)

环境模块通常只为您修改几个环境变量。通常可以完全跳过module load whatever步骤而不依赖于这些模块。我推荐

subprocess.Popen(['/possibly/path/to/vncserver', ':8080', '-localhost'], 
                 env={'WHATEVER': 'you', 'MAY': 'need'})

而不是完全加载模块。

如果您坚持使用这种基本方法,那么您希望自己开始使用Popen(['bash',...进行攻击。

答案 1 :(得分:0)

如果您想使用shell=False进行此操作,只需将其拆分为两个Popen来电。

subprocess.check_call('module load vnc'.split())
subprocess.Popen('vncserver :8080 -localhost'.split())

答案 2 :(得分:0)

您可以从Python脚本调用modulemodule命令由环境模块软件提供,该软件还提供了python.py初始化脚本。

在Python脚本中评估该脚本将启用module python函数。如果/usr/share/Modules中安装了环境模块,则可以在/usr/share/Modules/init/python.py上找到此脚本。

以下代码启用module python函数:

import os
exec(open('/usr/share/Modules/init/python.py').read())

此后,您可以加载模块并启动应用程序:

module('load', 'vnc')
subprocess.Popen(['vncserver', ':8080', '-localhost'])