[英]ModuleNotFoundError when running python script from a batch file
[英]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.