我正在尝试使用python自动化部署过程。在部署中我做了" dzdo su - sysid"首先,然后执行部署过程。但是我无法在python中处理这个部分。我在shell中做了类似的事情,我使用了以下代码,
/bin/bash
psh su - sysid << EOF
. /users/home/sysid/.bashrc
./deployment.sh
EOF
这很好地处理了deployment.sh的执行。它执行sudo然后使用sysid id执行脚本。 我正在尝试使用python做类似的事情,但我无法找到&lt;&lt;在python中的EOF。
我正在使用subprocess.Popen执行dzdo部分,它执行dzdo,但是当我尝试执行下一个命令时,例如说&#34; ls -l&#34;,然后这个命令将不会被sysid执行,相反,我不得不退出sysid会话,一旦我退出,它将执行&#34; ls -l&# 34;在我的主目录中没用。有人可以帮我这个吗?
还有一件事,在这种情况下,我没有调用任何deployment.sh,但我会调用cp,rm,mkdir等命令。
答案 0 :(得分:0)
shell脚本示例中<< EOF
和EOF
之间的文本将写入psh
进程的标准输入。因此,您必须重定向Popen
实例的标准输入,并将数据直接写入实例的stdin
文件或使用communicate()
方法:
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from subprocess import Popen, PIPE
SHELL_COMMANDS = r'''\
. /users/home/sysid/.bashrc
./deployment.sh
'''
def main():
process = Popen(['psh', 'su', '-', 'sysid'], stdin=PIPE)
process.communicate(SHELL_COMMANDS)
if __name__ == '__main__':
main()
如果您需要流程的输出&#39; stdandard输出和/或错误然后你需要管道那些并使用communicate()
调用的返回值。