自己最近使用 Python 写 Oracle,WebLogic 等自动化安装脚本。
自己还不会 Shell 编程,所以使用了 Python, 以后学了 Shell 编程,再使用 Shell 重写。
有一个问题是使用 subprocess.call(['source /etc/profile'], shell=True)
类似这样的命令可以被执行,但不会生效,$PATH 并不改变。
上网查了几篇文章,说 SSH 连接的终端并不是实际意义上的 bash
目前可以使用某个命令的绝对地址,但这样有点麻烦,有些地址很长,强迫症都犯了。
有没有人做过类似的东西,有没有更好的方法,请大佬指教一二。
1
hanxiV2EX 2018-08-02 09:16:24 +08:00 via Android
每次 subprocess.call 都是单独的环境吧,你把所有命令拼成一行。只调用一次 subprocess.call
|
2
leido 2018-08-02 09:19:29 +08:00
二楼正解
|
3
narakus 2018-08-02 09:21:00 +08:00
subprocess.call 会生成一个子 shell 来执行,直接完成后就退出了,你环境变量设置到子 shell 的环境变量里面去了
|
4
xiaket 2018-08-02 09:25:45 +08:00
subproces 的 env 设 PATH
|
5
wweir 2018-08-02 09:26:55 +08:00 via Android
ssh 连接的时候是可以选择传递制定的环境变量的,不过不知道 python 的封装有没有暴露相应的配置项。
另外环境变量是在父子进程之间传递的,你一个 subprocess 执行完就退出自然啥都不剩。 并且 source 是 shell 内置命令,必须在 shell 中执行。 如果想要用你的方式实现的话,需要这么干 bash -c 'source xxx; ls' |
6
Ansen 2018-08-02 09:32:42 +08:00
env = 'xxxxx'
subprocess.Popen(RUN_COMMAND, env = env, shell=True) |
7
deepreader 2018-08-02 09:49:34 +08:00
|
8
SKYNE OP |
9
SKYNE OP @deepreader 好的,非常感谢
|
10
d0m2o08 2018-08-02 10:41:47 +08:00
楼主为什么不用 ansible 试试
|