1

我正在尝试运行 vnc 服务器,但为了首先执行此操作,我需要运行“模块加载 vnc”。

如果我调用which module加载的 bash shell,则找不到的命令是 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列表中看到与我想开始的完全相同的命令。

你能告诉我如何从子进程模块启动这个命令吗?是否可以从 开始shell=False

4

3 回答 3

2

环境模块通常只是为您修改几个环境变量。通常可以module load whatever完全跳过这一步,只是不依赖于这些模块。我建议

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

而不是加载模块。

如果您确实坚持使用这种基本方法,那么您想自己开始使用Popen(['bash',....

于 2011-08-19T15:23:13.003 回答
0

如果你想用 来做shell=False,只需把它分成两个Popen调用。

subprocess.check_call('module load vnc'.split())
subprocess.Popen('vncserver :8080 -localhost'.split())
于 2011-08-19T14:57:19.517 回答
0

您可以module从 Python 脚本调用。该module命令由 environment-modules 软件提供,该软件还提供了一个python.py初始化脚本。

在 Python 脚本中评估此脚本会启用modulepython 函数。如果 environment-modules 安装在 中/usr/share/Modules,您可以在 中找到此脚本/usr/share/Modules/init/python.py

以下代码启用modulepython 功能:

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

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

module('load', 'vnc')
subprocess.Popen(['vncserver', ':8080', '-localhost'])
于 2018-08-06T18:57:59.383 回答