如何在Bash脚本中使用virtualenv激活
你如何创build一个Bash脚本来激活一个Python的virtualenv?
我有一个目录结构,如:
.env bin activate ...other virtualenv files... src shell.sh ...my code...
我可以激活我的virtualenv:
user@localhost:src$ . ../.env/bin/activate (.env)user@localhost:src$
但是,从Bash脚本执行相同的操作却什么也不做:
user@localhost:src$ cat shell.sh #!/bin/bash . ../.env/bin/activate user@localhost:src$ ./shell.sh user@localhost:src$
我究竟做错了什么?
当你来源时,你正在加载激活脚本到你的主动shell。
当你在一个脚本中执行它时,将它加载到该脚本完成时退出的shell中,然后返回到原始未激活的shell。
你最好的select是做一个函数
activate () { . ../.env/bin/activate }
或别名
alias activate=". ../.env/bin/activate"
希望这可以帮助。
你应该使用源码来调用bash脚本。
这里是一个例子:
#!/bin/bash # Let's call this script venv.sh source "<absolute_path_recommended_here>/.env/bin/activate"
在你的shell中就像这样调用它:
> source venv.sh
或者@outmindbuild议:
> . venv.sh
你走了,壳牌指示将被放置在你的提示。
虽然它不会在shell提示符中添加“(.env)”前缀,但我发现这个脚本按预期工作。
#!/bin/bash script_dir=`dirname $0` cd $script_dir /bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i"
例如
user@localhost:~/src$ which pip /usr/local/bin/pip user@localhost:~/src$ which python /usr/bin/python user@localhost:~/src$ ./shell user@localhost:~/src$ which pip ~/.env/bin/pip user@localhost:~/src$ which python ~/.env/bin/python user@localhost:~/src$ exit exit
Sourcing在您当前的shell中运行shell命令。 当你像上面这样做脚本的内部源代码时,你正在影响脚本的环境,但是当脚本退出时,环境变化就会被撤消,因为它们已经超出了范围。
如果您的目的是在virtualenv中运行shell命令,那么在激活脚本之后,您可以在脚本中执行该命令。 如果你的意图是与virtualenv中的一个shell进行交互,那么你可以在你的脚本中产生一个子shell来inheritance这个环境。
什么是源代码的bash脚本?
-
如果您打算在多个virtualenvs之间切换或快速input一个virtualenv,您是否尝试过
virtualenvwrapper
? 它提供了很多的workon venv
,如workon venv
,mkvirtualenv venv
等等。 -
如果你只是在特定的virtualenv中运行一个python脚本,使用
/path/to/venv/bin/python script.py
来运行它。