通常包含脚本的方式是"源"
例如:
main.sh:
#!/bin/bash
source incl.sh
echo "The main script"
Run Code Online (Sandbox Code Playgroud)
incl.sh:
echo "The included script"
Run Code Online (Sandbox Code Playgroud)
执行"./main.sh"的输出是:
The included script
The main script
Run Code Online (Sandbox Code Playgroud)
...现在,如果您尝试从其他位置执行该shell脚本,除非它在您的路径中,否则无法找到包含.
确保脚本可以找到包含脚本的好方法是什么,特别是如果脚本需要可移植的话?
我正试图通过bash脚本激活我的conda env.即使脚本运行正常并且我的PATH似乎在脚本中被更改,它也会在脚本终止后以某种方式重置.我可以source activate test从cmd线调用,它工作正常.下面的输出示例.
脚本:
PycharmProjects/test » cat ./example.sh
echo "before calling source: $PATH"
source activate test
echo "after calling source: $PATH"
输出:
./example.sh
before calling source: /Use rs/me/miniconda3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin
discarding /Users/me/miniconda3/bin from PATH
prepending /Users/me/miniconda3/envs/test/bin to PATH
after calling source: /Users/me/miniconda3/envs/test/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin`
Run Code Online (Sandbox Code Playgroud)
但如果我echo $PATH在脚本完成后,你可以看到它$PATH没有改变(即没有/Users/me/miniconda3/envs/test/bin):
PycharmProjects/test » echo $PATH /Users/me/miniconda3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin
我在Windows中使用Python和Django的经验有限,现在我想了解如何将代码部署到Ubuntu 16.04 LTS VPS。阅读了关于SE的各种教程和很多答案之后,我设法进行了很长时间(对我而言),但是现在我陷入了困境。
手动(通过腻子)我可以执行以下操作:
# check that Python 3.5 is installed
python3 --version
# install pip
sudo -kS apt-get -y install python3-pip
# upgrade pip to newest version
pip3 install --upgrade pip
# check result
pip3 --version
# install venv
sudo -kS pip3 install virtualenv virtualenvwrapper
# create venv
virtualenv ~/Env/firstsite
# make sure venv is created
ls -l ~/Env/firstsite/bin/python # /home/droplet/Env/firstsite/bin/python3.5 -> python3
# switch on venv
source ~/Env/firstsite/bin/activate # (firstsite) droplet@hostname:~$
# check that python3 is taken …Run Code Online (Sandbox Code Playgroud) 我想编写一个简单的 bash 脚本来激活 anaconda 环境并在该环境中打开 jupyter notebooks。我只想通过首选环境简化笔记本的启动过程。
这就是我所拥有的:
cd ~/my_notebooks_folder
conda activate my_env
jupyter-notebook
conda info
Run Code Online (Sandbox Code Playgroud)
但是,这仍然会导致base环境处于活动状态,并且笔记本正在使用basepython运行。
我在 StackOverflow 上发现了两个关于这个问题的问题。然而,两者都没有帮助我。conda自这些问题发布以来,似乎功能已更改?
我在 Ubuntu 和 Linux Mint 上。康达版本:4.5.12。
这些是我尝试过的其他问题/答案:
我写了一个shell脚本.
source ve/bin/activate
Run Code Online (Sandbox Code Playgroud)
当我使用命令运行脚本时,将其保存为activate_shell.sh.
bash activate_shell.sh
Run Code Online (Sandbox Code Playgroud)
该脚本正在运行,没有错误,但虚拟环境未被激活.
我正在尝试激活 python 环境并在 bash 文件中使用 pip 安装一些包。它在环境中安装成功,但也在我的 mac 上全局安装,我不明白为什么。
脚本.sh:
#!/bin/bash
source '<absolute path>/venv/bin/activate'
which pip
pip install psutil
pip list
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./script.sh
<absolute path>/venv/bin/pip
...
Package Version
---------------- ---------
pip 19.0.3
psutil 5.6.3
setuptools 41.0.1
wheel 0.33.1
Run Code Online (Sandbox Code Playgroud)
但是,在另一个没有虚拟环境的终端中,它也会被安装:
$ which pip
/usr/local/opt/python/libexec/bin/pip
$ pip list
Package Version
---------------- ---------
pip 19.0.3
psutil 5.6.3
setuptools 41.0.1
wheel 0.33.1
Run Code Online (Sandbox Code Playgroud)
如果我在终端中一一键入脚本中的命令,它会按预期工作。
我缺少什么?
编辑:
如果我运行pip freeze | xargs pip uninstall -y(在环境中或全局中),它将删除 virtualenv 和全局中的包。
如果我再次运行脚本并列出“site-packages”中的内容,ls venv/lib/python3.7/site-packages则安装的包不存在,所以我的“venv/bin/pip”以某种方式指向我的全局“site-packages”?
edit2:我找到了一种重现行为的方法。
1. 创建环境 …