繁体   English   中英

从 shell 脚本运行 python 文件时出现 ModuleNotFoundError 错误

[英]ModuleNotFoundError error when running a python file from shell script

我有一个 python 文件download.py我在其中导入一个模块opc

现在,这个 python 文件从 shell 脚本build.sh调用,如:

python3 $(pwd)/scripts/download.py -d $dir_name

当我运行 shell 脚本时,我收到以下错误:

Traceback (most recent call last):
  File "/home/ray/Desktop/repo/image-builder/scripts/download.py", line 14, in <module>
    from opc.utils import file_utils, logger
ModuleNotFoundError: No module named 'opc'

这是调用 shell 脚本的方式:

sudo sh scripts/src/build.sh

我有一个活动的虚拟环境,我安装了这个 package。 还有这个 package

>pip list

Package                           Version
--------------------------------- -------
attrs                             21.2.0
.
.
opc                               0.8.0

有趣的是,当我直接运行 python 代码时

python3 scripts/download.py -d dir_path

它工作正常。 我没有收到ModuleNotFoundError错误。

此外,这也可以正常工作:

❯ python3
Python 3.8.10 (default, Sep 28 2021, 16:10:42) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import opc.utils.global_vars as g
>>> print(g.LOCAL_HOST)
127.0.0.1
>>>

目录结构:

/home/ray/Desktop/repo/image-builder/scripts/download.py
/home/ray/Desktop/repo/image-builder/scripts/src/build.sh

我正在运行以下命令:

/home/ray/Desktop/repo/image-builder

这可能是因为当您调用 shell 脚本时,python 路径与您运行 Python 解释器时的路径不同。 如果是这种情况,有几种方法可以解决这个问题。

如果您手动更改到与download.py相同的目录并从那里运行 python 脚本会发生什么? 就像是:

cd scripts
python download.py -d <some-dir>

这行得通,还是你仍然遇到同样的问题?

在像这样的 shell 脚本中,我首先确保脚本将始终从文件系统中完全相同的位置调用 python 应用程序,这样我就不会遇到这些 python 路径问题。 如果您确定python download.py -d <some-dir>在与download.py相同的目录中工作,那么您可以将这样的内容添加到您的 shell 脚本中(假设您的 Z2591C98B70119FE624898B download.py同一目录):

pushd "${0%/*}" # this changes directory to the directory where the shell script itself lives

# do your stuff here - run your python app, etc.

popd # returns to whatever directory we were originally in

这样,我总是可以从我所在的任何目录调用 shell 脚本,并且我知道它的行为方式相同 - 当前目录不再相关。

我不会使用$(pwd) ,因为这会给出当前目录,它会有所不同,所以如果你这样做,你的 shell 脚本只有在从正确的目录中调用时才能正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM