我正在使用虚拟环境,因此首先我必须说
source some/long/path/bin/activate
有时(实际上非常频繁)我想在终端中创建另一个选项卡,以编辑另一个脚本,或运行 django shell 等。创建另一个选项卡后,我不得不source some/long/path/bin/activate
再次说。事实上,这很无聊。
有什么方法可以强制终端自动运行这个神奇的单词?因此,如果我CtrlShiftT在终端中输入,并在当前选项卡中运行虚拟环境,则终端应该在新的选项卡中打开完全相同的虚拟环境。
或者可以用完全不同的方法来解决这个问题。
答案1
针对特定的终端仿真器
在创建新的终端选项卡时自动运行命令是您正在使用的特定终端的功能,与python
或无关virtualenv
。
为了得到更广泛的答案,这个问题可能必须是如何自动运行终端仿真器 xyz 的 shell 命令。例如,gnome-terminal
您可以使用自定义配置文件,如https://unix.stackexchange.com/a/3856/15312,但如果您决定切换到其他终端或平台,这是一个不可移植的解决方案。
另一方面,没有人希望被锁定在特定的终端应用程序上,因此下一个选择将是一种更便携的方法。
定位 shell 初始化脚本
如果您控制在选项卡中运行的 shell,那么您可以在 shell 初始化脚本中执行此操作。
例如,bash
您可以在脚本中添加以下几行~/.bashrc
:
if [[ -f .venv/bin/activate ]] ; then
source .venv/bin/activate
fi
将
zsh
代码片段添加到~/.zshrc
。
每当您创建新的 shell 或打开新的选项卡时,此代码片段都会检查.venv
当前路径中是否有文件夹并自动激活该 venv。如果您在未命名的文件夹中创建虚拟环境,.venv
则请相应地调整脚本。
您可能还想覆盖cd
,以便每当您cd
进入 venv 时它都会自动激活:
以下是一个例子zsh
:
function cd() {
builtin cd $1
if [[ -f .venv/bin/activate ]] ; then
source .venv/bin/activate
fi
}
使用以下方式减少打字virtualenvwrapper
具体来说virtualenv
:你可能想尝试虚拟环境包装器它可以帮助减少打字量,并通过为虚拟环境文件夹提供自动完成功能使管理环境更容易。
后台进程
最后,作为一种快速解决方法,您可以用+暂停当前正在运行的进程(例如manage.py runserver
),而不是使用相同的环境创建新的选项卡,如果您想让它继续运行,可以选择运行以在后台恢复它,然后编辑并保存文件,并使用 将原始进程带回前台。参见Ctrzbg
fg
这更多细节。
答案2
我正在使用 conda 来创建虚拟环境,我感觉和你的问题有同样的需要。所以我自己写了一个简单的 shell 脚本。然后我遇到了这个问题,并重写了我的脚本以供虚拟环境使用。
- 将以下代码保存为脚本
- 随意命名。比如说
tab
。 - 授予执行权限:
sudo chmod +x tab
。 mv tab /usr/local/bin/
使其成为可以从任何地方调用的命令。- 该脚本依赖于其他三个工具:xclip、xdotool 和 wmctrl。如果您没有这些工具,
sudo apt install xclip xdotool, wmctrl
- 耶!我之前太懒了,不想Control+ Shift+T然后跑
source /.../bin/activate
,但现在我可以做到了tab
!
#!/bin/sh
# Copy the clipboard content to restore later
original_clipboard=$(xclip -o)
# Copy the path of your virtual environment to clipboard
echo $VIRTUAL_ENV | xclip
# The following four lines open a new tab and switch to it.
# Copied from: https://stackoverflow.com/a/2191093/10953328
WID=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}')
xdotool windowfocus $WID
xdotool key ctrl+shift+t
wmctrl -i -a $WID
# Activate your virtualenv
xdotool type --delay 0.5 --clearmodifiers "source $(xclip -o)/bin/activate"
xdotool key Return;
# Restore the original clipboard content
echo $original_clipboard | xclip
使用 Ubuntu 18.0.4、GNOME 3.28.2 进行测试,并且运行良好。xdotools 3.20160805.1、xclip 0.12、wmctrl 1.07,但我真的不认为这会有太大影响,不是吗?
部分剧本抄袭自这个答案,正如剧本本身所提到的那样。