Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与python中的Linux shell源代码命令等效_Python_Shell - Fatal编程技术网

与python中的Linux shell源代码命令等效

与python中的Linux shell源代码命令等效,python,shell,Python,Shell,将shell脚本转换为python并尝试找到执行以下操作的最佳方法。我需要它,因为它包含我需要读取的环境变量 if [ -e "/etc/rc.platform" ]; then . "/etc/rc.platform" fi 我已转换了“if”,但不确定如何处理此问题。“/etc/rc.platform”作为源代码是一个shell命令。到目前为止,我有以下几点 if os.path.isfile("/etc/rc.platform"): print "exists" <

将shell脚本转换为python并尝试找到执行以下操作的最佳方法。我需要它,因为它包含我需要读取的环境变量

if [ -e "/etc/rc.platform" ];
then
    . "/etc/rc.platform"
fi
我已转换了“if”,但不确定如何处理此问题。“/etc/rc.platform”作为源代码是一个shell命令。到目前为止,我有以下几点

if os.path.isfile("/etc/rc.platform"):
    print "exists" <just to verify the if if working>
    <what goes here to replace "source /etc/rc.platform"?>
如果os.path.isfile(“/etc/rc.platform”):
打印“存在”
我已经查看了subprocess和execfile,但没有成功

python脚本需要访问rc.platform设置的环境变量,请尝试以下操作:

if os.path.exists ("/etc/rc.platform"):
    os.system("/etc/rc.platform")

由于
source
是shell内置的,因此在调用
子流程调用时需要设置
shell=True

>>> import os
>>> import subprocess
>>> if os.path.isfile("/etc/rc.platform"):
...     subprocess.call("source /etc/rc.platform", shell=True)
我不确定您在这里想做什么,但我仍然想提及:
/etc/rc.platform
可能会导出一些shell函数,供
rc.d
中的其他脚本使用。由于这些是shell函数,它们将仅导出到由
subprocess.call()
调用的shell实例,如果您调用另一个
subprocess.call()
,这些函数将不可用,因为您正在生成一个新的shell来调用新脚本。

(以下是crayzeewulf在其评论中描述的解决方案的演示。)

如果
/etc/rc.platform
仅包含环境变量,则可以读取它们并将它们设置为Python进程的环境变量

给定此文件:

$ cat /etc/rc.platform
FOO=bar
BAZ=123
读取和设置环境变量:

>>> import os
>>> with open('/etc/rc.platform') as f:
...     for line in f:
...         k, v = line.split('=')
...         os.environ[k] = v.strip()
... 
>>> os.environ['FOO']
'bar'
>>> os.environ['BAZ']
'123'

一个有点粗俗的解决方案是解析
env
输出:

newenv = {}
for line in os.popen('. /etc/rc.platform >&/dev/null; env'):
    try:
        k,v = line.strip().split('=',1)
    except:
        continue  # bad line format, skip it
    newenv[k] = v
os.environ.update(newenv)

编辑:修复了拆分参数,这要感谢@l4mpi

为返回做了太多的工作。将保留一个小的shell脚本来获取我们需要的所有环境变量,而忘记将它们读入python。

您必须解析
/etc/rc.platform
,提取环境变量名称和值,并相应地更新。@Crazyewulf-这不是ju关于环境变量,脚本还可以导出bash函数。除非您试图对所有调用的脚本重用同一个shell,否则您打算如何从python脚本中使用它们。我建议也将
/etc/rc.platform
移植到python,因为
import
。如果您试图用python重新编写脚本,那么很可能需要用python重写/etc/rc.platform。如果它只是进行变量赋值,您可以将其设置为一个配置文件。在一般情况下,您尝试做的是困难的。@Tuxdude您对于一般情况是正确的。但是q中提到的OP“我需要它,因为它包含我需要读取的环境变量。”因此,我认为OP可能只关心此文件中的环境变量。如果在子shell中运行脚本,则不会有任何帮助,因为所有环境变量设置都将被丢弃。@grep-我知道这一点,而且它不仅涉及环境变量,甚至还涉及由
/等导出的bash函数/python脚本将无法使用rc/platform
,并且任何新的shell开始从say
/etc/rc.d
调用其他相关脚本。这与OP引用的shell脚本的效果不同。
os.system
在子shell中运行命令,因此,父进程将不会看到添加的任何环境变量d/modified by
/etc/rc.platform
。您无法在python进程中生成sh或bash脚本,因为python进程不知道如何解释bash语言。因此,您需要一个子shell来运行bash并解释脚本。由于它是在子shell中完成的,因此python进程将无法获取新的env值。如果变量引用,则此操作将不起作用在声明中添加其他变量,例如
X=“$Y/foo”
。此外,脚本还可以使用其他shell命令(如awk、grep等)或者内置shell变量,这显然不会被计算。好的方面。我想这里的共识是,除了我用作示例的最简单的情况外,没有简单的方法可以实现这一点。我曾经需要类似的东西,结果生成了一个子shell,获取脚本,然后解析
env
的输出。。。也许晚饭后我会写一个答案。