从 bash 脚本执行 Python 程序时出现 ModuleNotFoundError

ModuleNotFoundError when executing Python program from bash script

我有一个使用 inotify-tools 监视目录的脚本。将新文件添加到目录时,脚本会调用 python 程序并将路径和填充名称作为参数传递。

一切正常,除了我得到一个 ModuleNotFoundError... 有问题的模块是 boto3(适用于 AWS S3)。

python 脚本在 Pycharms 中运行良好,所以我真的不知道是什么导致了错误。

监控脚本:

source=
pythonscriptlocation=

inotifywait -m $source -e create -e moved_to |
while read path action file; do
    python $pythonscriptlocation $path $file
done

Python 脚本示例:

import argparse
import boto3

parser = argparse.ArgumentParser();
parser.add_argument("source_path");
parser.add_argument("filename");
args = parser.parse_args();
print(args.source_path);
print(args.filename);

更新-解决方案

原来 ANACONDA 在我的 .bashrc 文件的底部添加了一个环境变量...结果,它搞砸了我的 PATH。删除了该行,然后又出现了 1 个问题:在监控脚本中,我正在调用 python,但本应调用 python3.

你是如何启动这个脚本的?我猜想您 运行 所在的用户环境在某些方面与交互环境不同。最可能的原因是您在这两个环境之间设置了不同的 PYTHONPATH 环境变量——尝试在 运行 您的 Python 代码之前打印出来并查看如果不同。

另一种可能是您在两个环境中设置了不同的路径,甚至 运行 的 Python 版本也不相同。检查你的 PATH 环境变量,看看它们是否相同。

这些可能不同的一个原因是,如果您的脚本运行的交互式环境正在从您的 .profile 文件中获取这些或其他配置。 .profile 仅由登录 shell 读取,其他 shell 不读取。将这些放在 .bashrc 而不是 .profile 中可能会有所不同。

(不言而喻,如果您 运行 在这两个上下文中作为不同的用户,则相关的环境变量需要出现在两个用户的配置中。)