从 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 中可能会有所不同。
(不言而喻,如果您 运行 在这两个上下文中作为不同的用户,则相关的环境变量需要出现在两个用户的配置中。)
我有一个使用 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 中可能会有所不同。
(不言而喻,如果您 运行 在这两个上下文中作为不同的用户,则相关的环境变量需要出现在两个用户的配置中。)