Python 调用subprocess.call([';';,bash#u path])时权限被拒绝

Python 调用subprocess.call([';';,bash#u path])时权限被拒绝,python,bash,subprocess,chmod,Python,Bash,Subprocess,Chmod,当我运行以下代码时 import os import subprocess bash_path = os.path.expanduser('~/.bash_profile') subprocess.call(['.', bash_path]) 我得到以下错误: Traceback (most recent call last): File "/path/to/my/script/my_script.py", line 4, in my_func subpro

当我运行以下代码时

import os
import subprocess

bash_path = os.path.expanduser('~/.bash_profile')
subprocess.call(['.',  bash_path])
我得到以下错误:

Traceback (most recent call last):
  File "/path/to/my/script/my_script.py", line 4, in my_func
    subprocess.call(['.',  bash_path])
  File "/Users/user/miniconda3/envs/live_auction/lib/python3.7/subprocess.py", line 323, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/Users/jisom/miniconda3/envs/live_auction/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/Users/jisom/miniconda3/envs/live_auction/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
PermissionError: [Errno 13] Permission denied: '.'
我还尝试了变体
subprocess.call(['source',bash_path])
,但是我在
源代码
替换
时得到了相同的结果。从python脚本看来,我没有调用
源代码
的权限,但从我的终端我有

我正在尝试重新加载环境变量,因为在此之前,我的程序调用了另一个子进程来更新一些配置变量,但是,在我重新加载它们或重新启动终端之前,它们不可用


如何从python脚本中重新生成源代码?这里有两个问题:

  • (及其别名
    source
    )不是可由
    execv
    (或Python中的
    子进程
    执行的程序。它们是外壳内置的

  • 并非巧合,
    不能由外部程序实现,这就是为什么它内置于shell中

  • 第一个解释了为什么不能使用
    子流程。调用
    执行
    源代码
    <代码>子进程调用
    只能执行外部程序。它无法执行内置的shell,因为没有shell
    subprocess.call
    在Python程序中运行,而不是在shell中运行。因此,当您尝试
    subprocess.call('.',…)
    时,您正在尝试执行
    ,这是一个目录。说您没有运行目录的权限在技术上是正确的,但作为一条错误消息并没有多大用处;即使是根用户也无法执行目录。我希望
    subprocess.call(['source',…])
    会产生一个“没有这样的文件或目录”错误,但可能在执行路径的某个地方有一个名为
    source
    (没有执行权限)的文件。(这不是一个好主意,因为
    source
    通常用作shell内置。)

    但这确实是第二个关键问题。外部程序,即使是作为子程序运行的程序,也无法进入Python运行的进程并追溯更改进程环境变量。(或者,就这一点而言,是当前工作目录,这就是为什么您不能调用
    子流程.call
    cd命令的原因。)

    所谓环境变量,是因为它们是执行环境的一部分。执行环境是与流程一起创建的,或者说流程的一部分就是执行环境更好。大多数执行环境都是从进程父级继承的。但这并不意味着进程与其子进程共享其环境。相反,进程将其环境复制到为子进程创建的新环境中。因此,环境变量从父对象传递到子对象,但子对象的变量是其自身的自变量;更改它们不会影响父对象的环境变量,也不会影响其已生成子对象的环境变量

    当您启动新的“登录shell”(即与操作系统协商以允许您登录的过程)时,该shell将执行您的配置文件脚本,该脚本将自定义shell的执行环境。(如果您的shell是
    bash
    ,它将使用特定于bash的概要文件
    ~/.bash\u概要文件
    脚本,如果它存在的话。)从那时起,新创建的shell子级(包括您启动的所有其他进程,包括图形控制台会话)将使用此执行环境的副本启动


    配置文件脚本的执行必须使用
    (或等效工具)完成,因为其目的是更改当前的执行环境<代码>可以做到这一点,因为它是bash命令,而不是在子流程中运行的外部命令。它只是执行给定脚本中的每个shell命令,就好像您直接键入了它一样,因此它发生在当前执行环境中。但是Python没有任何等价物。Python不是bash shell,它不知道任何bash命令行的含义。

    源代码
    是shell内置的;它们不是单独的可执行程序。在bash cli上,您是否向python文件添加了执行权限?sudo chmod+x myscript.py