python中的子流程模块要求“模块列表”中的“找不到命令”?

时间:2019-04-01 19:42:06

标签: python scripting subprocess environment-modules

我当前正在使用python中的子进程模块进行脚本编写,尽管我在shell中运行该命令时仍无法执行命令“模块列表”,并且在使用子进程时却无法使用其他任何类型的命令,但我无法执行命令“模块列表”执行命令的模块。

我尝试过两种变体:

p = subprocess.Popen('module list', shell=True)
print(p.communicate()[0])

p = Popen(["module", "list"], stdout=subprocess.PIPE)
print(p.communicate()[0])

对于诸如“ echo hello world”之类的命令,甚至更长的带有多个参数的命令,这两种格式都可以正常工作。我从其他终端运行命令的终端与使用子进程执行命令的外壳不同吗?我得到的错误如下:

/bin/bash: line 1: module: command not found

2 个答案:

答案 0 :(得分:0)

根据您在注释中所说的,我相信您将以错误的方式使用Python中的环境模块:实际上,模块本身中有一种方法可以将module功能导入Python,例如here解释:

>>> execfile('/usr/local/Modules/default/init/python.py')
>>> module('list')
No Modulefiles Currently Loaded.
>>> module('load','foo')
>>> module('list')
Currently Loaded Modulefiles:
  1) foo/1.0

当然,使用execfile()并不是很安全,因此我稍微偏爱描述的here的导入方法(为Python 3支持而稍作改动):

import os

if 'PYTHONPATH' in os.environ:
    os.environ['PYTHONPATH'] +=':'+os.environ['MODULESHOME']+"/init"
else:
    os.environ['PYTHONPATH'] = os.environ['MODULESHOME']+"/init"

from python import module

答案 1 :(得分:0)

环境模块软件的文档提供了有关如何在Python中初始化module命令(在Python 2或3上都可以使用)的建议:

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

一旦初始化,module函数将可用,并且可以通过以下方式使用:

module('sub-command', 'arg1', 'arg2', ...)

例如:

module('load', 'foo', 'bar')
module('list')
module('avail')