fish 脚本没有源 python venv 激活文件
fish script does not source python venv activation file
我制作了一个非常简单的 fish shell 脚本来激活特定的 python 虚拟环境。
如果我在 fish 中手动执行 source 命令 shell 一切正常,但是 运行 使用以下 shell 脚本不会激活 venv。
#! /usr/bin/fish
set FILEPATH "/home/shyney/.venv/venvname/bin/activate.fish"
if test -e $FILEPATH
source $FILEPATH
echo "activation file found"
echo $FILEPATH
end
脚本运行正常,但 venv 仍未激活。
简答建议:
alias -s myvenv="source /home/shyney/.venv/venvname/bin/activate.fish"
将 myenv
替换为您想要调用您的 venv 激活的任何内容 function/alias。然后只需调用 myenv
激活,然后(像往常一样)调用 deactivate
结束 venv。
alias -s
命令只需运行一次,因为它保存了~/.config/fish/functions/myvenv.fish
中的函数(默认)。当您在 shell.[= 中第一次调用 myvenv
时,该函数是“延迟加载”的(因为该函数的名称与 functions
目录中的文件相同) 24=]
解释:
有点重复 of this Bash question,至少在“根本原因”上是这样,但由于这个问题是关于鱼的,所以最终会有一个 different/better 答案。
我认为我们中的大多数人 运行 在我们“shell/command-line”体验的早期某个时候都遇到过这个问题。
你不能在脚本中获取文件的原因与你必须首先获取它的原因相同(否则,Python 只会使它成为可执行文件)。
执行脚本与采购之间的区别:
当你运行一个脚本时,脚本运行在它自己的进程中(通常是一个“subshell”),它有它自己的环境。当脚本退出时,父进程returns,具有其(未更改)环境。所以 venv 是 活跃的 within 脚本,尽管非常短暂。脚本结束时,venv 环境不再出现在您的交互式 shell.
中
当你源一个文件时,另一方面,文件中的命令被读入当前 shell 进程。这就是采购可以改变当前 shell 环境的原因。
我为您的用例推荐的解决方法是将其创建为函数,而不是可执行脚本。 Fish 函数(对于大多数 shells)在 当前 shell 进程中执行 运行 并且可以修改全局环境。
有几种方法可以做到这一点。最简单的方法是使用上面的 alias
命令。如那里所解释的,这会在延迟加载的文件中创建一个函数声明。直到您需要时,该函数才会加载到内存中。这是 Fish 和 Zsh 中的一个功能,但 Bash 或 Posix 中没有。但最终它在 Fish 中更加用户友好(恕我直言)。
将其定义为别名还可以让您使用 alias
命令轻松调用它。例如:
> alias
alias exa 'exa -l --color=always --header --icons -F $argv | bat'
alias ls 'exa -l --color=always --header --icons -F $argv | bat'
alias myvenv 'source /home/shyney/.venv/venvname/bin/activate.fish'
但是,如果没有别名的 Fish 语法糖,也没有什么可以阻止您手动执行此操作。只需使用以下内容创建一个文件 ~/.config/fish/functions/myvenv.fish
:
function myvenv
source "/home/shyney/.venv/venvname/bin/activate.fish"
end
只要函数名和文件名匹配就可以。
我制作了一个非常简单的 fish shell 脚本来激活特定的 python 虚拟环境。
如果我在 fish 中手动执行 source 命令 shell 一切正常,但是 运行 使用以下 shell 脚本不会激活 venv。
#! /usr/bin/fish
set FILEPATH "/home/shyney/.venv/venvname/bin/activate.fish"
if test -e $FILEPATH
source $FILEPATH
echo "activation file found"
echo $FILEPATH
end
脚本运行正常,但 venv 仍未激活。
简答建议:
alias -s myvenv="source /home/shyney/.venv/venvname/bin/activate.fish"
将 myenv
替换为您想要调用您的 venv 激活的任何内容 function/alias。然后只需调用 myenv
激活,然后(像往常一样)调用 deactivate
结束 venv。
alias -s
命令只需运行一次,因为它保存了~/.config/fish/functions/myvenv.fish
中的函数(默认)。当您在 shell.[= 中第一次调用 myvenv
时,该函数是“延迟加载”的(因为该函数的名称与 functions
目录中的文件相同) 24=]
解释:
有点重复 of this Bash question,至少在“根本原因”上是这样,但由于这个问题是关于鱼的,所以最终会有一个 different/better 答案。
我认为我们中的大多数人 运行 在我们“shell/command-line”体验的早期某个时候都遇到过这个问题。
你不能在脚本中获取文件的原因与你必须首先获取它的原因相同(否则,Python 只会使它成为可执行文件)。
执行脚本与采购之间的区别:
当你运行一个脚本时,脚本运行在它自己的进程中(通常是一个“subshell”),它有它自己的环境。当脚本退出时,父进程returns,具有其(未更改)环境。所以 venv 是 活跃的 within 脚本,尽管非常短暂。脚本结束时,venv 环境不再出现在您的交互式 shell.
中当你源一个文件时,另一方面,文件中的命令被读入当前 shell 进程。这就是采购可以改变当前 shell 环境的原因。
我为您的用例推荐的解决方法是将其创建为函数,而不是可执行脚本。 Fish 函数(对于大多数 shells)在 当前 shell 进程中执行 运行 并且可以修改全局环境。
有几种方法可以做到这一点。最简单的方法是使用上面的 alias
命令。如那里所解释的,这会在延迟加载的文件中创建一个函数声明。直到您需要时,该函数才会加载到内存中。这是 Fish 和 Zsh 中的一个功能,但 Bash 或 Posix 中没有。但最终它在 Fish 中更加用户友好(恕我直言)。
将其定义为别名还可以让您使用 alias
命令轻松调用它。例如:
> alias
alias exa 'exa -l --color=always --header --icons -F $argv | bat'
alias ls 'exa -l --color=always --header --icons -F $argv | bat'
alias myvenv 'source /home/shyney/.venv/venvname/bin/activate.fish'
但是,如果没有别名的 Fish 语法糖,也没有什么可以阻止您手动执行此操作。只需使用以下内容创建一个文件 ~/.config/fish/functions/myvenv.fish
:
function myvenv
source "/home/shyney/.venv/venvname/bin/activate.fish"
end
只要函数名和文件名匹配就可以。