首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在虚拟环境中运行shell exectued python脚本

如何在虚拟环境中运行shell exectued python脚本
EN

Stack Overflow用户
提问于 2022-08-31 06:48:35
回答 2查看 125关注 0票数 2

我有一个shell脚本,它执行一些python代码,并在此之前安装必要的依赖项:

代码语言:javascript
复制
sudo -E PATH="$PATH" python3 -m pip install -r requirements.txt

脚本在执行时成功运行,如下所示:

代码语言:javascript
复制
./script.sh

但是,当我使用sudo权限运行脚本时,我从Python获得了一个导入错误:

代码语言:javascript
复制
sudo ./script.sh
代码语言:javascript
复制
Traceback (most recent call last):
  File "dsc.py", line 2, in <module>
    from imblearn.over_sampling import ADASYN
  File "/usr/local/lib/python3.8/dist-packages/imblearn/__init__.py", line 53, in <module>
    from . import ensemble
  File "/usr/local/lib/python3.8/dist-packages/imblearn/ensemble/__init__.py", line 8, in <module>
    from ._forest import BalancedRandomForestClassifier
  File "/usr/local/lib/python3.8/dist-packages/imblearn/ensemble/_forest.py", line 28, in <module>
    from sklearn.utils.fixes import _joblib_parallel_args
ImportError: cannot import name '_joblib_parallel_args' from 'sklearn.utils.fixes' (/usr/local/lib/python3.8/dist-packages/sklearn/utils/fixes.py)

当脚本被赋予sudo权限时,我不明白为什么Python不能再导入ADASYN。

我正在使用virtualenv进行版本控制。在执行shell脚本时,当我检查imblearn包在同一个虚拟环境中的位置时,我得到:

代码语言:javascript
复制
❯ python3 -m pip show imblearn
WARNING: Package(s) not found: imblearn

但当我不在虚拟环境中时,我可以找到它:

代码语言:javascript
复制
❯ deactivate
❯ python3 -m pip show imblearn
Name: imblearn
Version: 0.0
Summary: Toolbox for imbalanced dataset in machine learning.
Home-page: https://pypi.python.org/pypi/imbalanced-learn/
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Location: /usr/local/lib/python3.8/dist-packages
Requires: imbalanced-learn
Required-by: 

这意味着我的shell脚本确实安装了依赖项,但不安装在执行它的虚拟环境中。删除imblearn包并运行shell脚本将再次安装它,因此我确信,将包安装到默认位置的是这个shell脚本。我认为,通过使用sudo -E PATH="$PATH"选项运行Python,可以确保python命令具有与运行它的虚拟环境相同的路径,因此具有正确的依赖关系。但是,考虑到依赖项安装在默认的package目录/usr/local/lib/python3.8/dist-packages中,情况似乎并非如此。

,那么我如何在执行shell脚本的同一个虚拟环境中运行python代码呢?是可能的吗?我熟悉Python,但对shell非常陌生。

我使用的是Python3.8.10(这两者都是默认的和虚拟的),Ubuntu20.04和zsh。

EN

回答 2

Stack Overflow用户

发布于 2022-08-31 07:08:50

如果运行sudo ./script.sh,脚本的实际执行者是超级用户,这意味着虚拟env中与env相关的内容没有同步结束。

您可能需要在./script.sh中指定python虚拟env,即在./script.sh#!path/to/your/virtualenvs/python的顶部添加一行

票数 1
EN

Stack Overflow用户

发布于 2022-08-31 07:41:28

运行bash脚本可以缓解这个问题,如下所示:

代码语言:javascript
复制
sudo -E PATH=$PATH ./script.sh

而不仅仅是sudo ./script.sh

这样,sudo执行shell脚本,然后传递当前虚拟and的python路径。

在shell脚本中,您现在不需要使用sudo -E PATH=$PATH script.py执行所有python脚本,而只需使用python script.py就够了,因为在本例中,python指的是虚拟版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73551877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档