我有一个shell脚本,它执行一些python代码,并在此之前安装必要的依赖项:
sudo -E PATH="$PATH" python3 -m pip install -r requirements.txt脚本在执行时成功运行,如下所示:
./script.sh但是,当我使用sudo权限运行脚本时,我从Python获得了一个导入错误:
sudo ./script.shTraceback (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包在同一个虚拟环境中的位置时,我得到:
❯ python3 -m pip show imblearn
WARNING: Package(s) not found: imblearn但当我不在虚拟环境中时,我可以找到它:
❯ 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。
发布于 2022-08-31 07:08:50
如果运行sudo ./script.sh,脚本的实际执行者是超级用户,这意味着虚拟env中与env相关的内容没有同步结束。
您可能需要在./script.sh中指定python虚拟env,即在./script.sh:#!path/to/your/virtualenvs/python的顶部添加一行
发布于 2022-08-31 07:41:28
运行bash脚本可以缓解这个问题,如下所示:
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指的是虚拟版本。
https://stackoverflow.com/questions/73551877
复制相似问题