[英]Using python subprocess to use the "source" linux command with a bashrc file
我的任务是使用 python 自动化运行 bash 脚本的过程。 不幸的是,我不对 bash 脚本本身负责,所以我不知道它是如何工作的。 当我使用source adastralrc.sh
直接在终端中运行脚本时,它可以完美运行并提供所需的 output。
但是,当我尝试使用子进程和与参数完全相同的命令让 python 运行文件时:
import subprocess
commands = ['source' , 'adastralrc.sh']
p = subprocess.run(commands)
我收到以下错误:
Traceback (most recent call last):
File "test2.py", line 6, in <module>
p = subprocess.call(commands)
File "/usr/lib64/python3.6/subprocess.py", line 287, in call
with Popen(*popenargs, **kwargs) as p:
File "/usr/lib64/python3.6/subprocess.py", line 729, in __init__
restore_signals, start_new_session)
File "/usr/lib64/python3.6/subprocess.py", line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'source adastralrc.sh': 'source adastralrc.sh'
(venv-c3dns) [vivegab@adl20213d1bld01 vivegab] (cth01/dns_mano_dev)
我对子进程相当缺乏经验,但我认为它只是os.system()
的改进版本,应该像输入命令一样输入命令。 那么为什么我会收到上面的错误以及可以做些什么来解决这个问题呢?
def shell_source(script):
"""Sometime you want to emulate the action of "source" in bash,
settings some environment variables. Here is a way to do it."""
import subprocess, os
pipe = subprocess.Popen(". %s; env" % script, stdout=subprocess.PIPE, shell=True)
output = pipe.communicate()[0]
env = dict((line.split("=", 1) for line in output.splitlines()))
os.environ.update(env)
shell_source(adastralrc.sh)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.