我正在尝试运行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
开始?
答案 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脚本调用module
。 module
命令由环境模块软件提供,该软件还提供了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'])