使用python子流程来使用;资料来源;带有bashrc文件的linux命令

使用python子流程来使用;资料来源;带有bashrc文件的linux命令,python,python-3.x,bash,subprocess,Python,Python 3.x,Bash,Subprocess,我的任务是使用python自动化运行bash脚本的过程。不幸的是,我不对bash脚本本身负责,所以我不知道它是如何工作的。当我使用source adastralrc.sh直接在终端中运行脚本时,它工作得非常好,并提供了所需的输出 但是,当我尝试使用子进程和与参数完全相同的命令让python运行文件时: import subprocess commands = ['source' , 'adastralrc.sh'] p = subprocess.run(commands) 我得到以下错误:

我的任务是使用python自动化运行bash脚本的过程。不幸的是,我不对bash脚本本身负责,所以我不知道它是如何工作的。当我使用
source adastralrc.sh
直接在终端中运行脚本时,它工作得非常好,并提供了所需的输出

但是,当我尝试使用子进程和与参数完全相同的命令让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)
回溯(最近一次呼叫最后一次):
文件“test2.py”,第6行,在
p=子流程调用(命令)
文件“/usr/lib64/python3.6/subprocess.py”,第287行,在调用中
将Popen(*popenargs,**kwargs)作为p:
文件“/usr/lib64/python3.6/subprocess.py”,第729行,在__
恢复信号,启动新会话)
文件“/usr/lib64/python3.6/subprocess.py”,第1364行,在执行子进程中
引发子项异常类型(错误号、错误消息、错误文件名)
FileNotFoundError:[Errno 2]没有这样的文件或目录:“source adastralrc.sh”:“source adastralrc.sh”
(venv-c3dns)[vivegab@adl20213d1bld01vivegab](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_源(adastralrc.sh)


这是否回答了您的问题?这很有效。但是shell脚本还需要在某个时刻输入密码。知道如何让子流程在出现提示时输入此密码吗?