在EC2实例(AWS)上使用Bash脚本加载模块时导入错误

2024-06-08 02:04:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过spot\u fleet\u请求方法的user\u data参数运行bash脚本。脚本执行所有安装并连接到文件系统,但是当它运行我需要运行的python文件时,它会给我以下错误:

Traceback (most recent call last):
  File "/home/ec2-user/efs/dir/create_lvl_output.py", line 8, in <module>
    from modeling import generators
ImportError: No module named modeling

其中modeling是一个文件夹,其中包含我正在导入的脚本“modeling/generators.py”。 我已尝试按照this post中的建议将目录分配给PYTHONPATH环境变量,以下是我的代码:

#!/bin/bash
export PYTHONPATH=/home/ec2-user/efs/Day-Trader/day_trader/
echo $PYTHONPATH

...mount efs
...installs

python /home/ec2-user/efs/dir/create_lvl_output.py > levelset.txt

但它继续以同样的错误失败。我尝试了以下每个变体的解决方案,但它们都未能解决导入问题

echo "export PYTHONPATH=/home/ec2-user/efs/dir/" >> ~/.bashrc
. ~/.bashrc      #--- failed to import, set PYTHONPATH variable correctly     

echo "export PYTHONPATH=/home/ec2-user/efs/dir/" >> /home/ec2-user/.bashrc
. /home/ec2-user/.bashrc   #--- failed to import, set PYTHONPATH variable correctly but got following error as well: /home/ec2-user/.bashrc: line 2: /root/.dlamirc: No such file or directory

我还确保脚本确实有效。如果我在登录ec2用户(即$HOME=/HOME/ec2 user/)时直接将脚本复制并粘贴到linux终端,并且运行良好并生成所有正确的输出。因此,我认为如果我按照this post中的建议更改bash脚本顶部的用户,它可能会工作,但以下命令仍然以root用户身份运行后面的所有命令:

su -l "ec2-user"su - ec2-user

我试着使用

su ec2-user -c 'python /home/ec2-user/efs/dir/create_lvl_output.py'

但它也不起作用。我没有主意了。请帮忙


Tags: pyimport脚本bashhomeoutputcreatedir
1条回答
网友
1楼 · 发布于 2024-06-08 02:04:04

我认为推荐的方法当然是尝试将代码打包为适当的模块,并在使用pip之前安装它,无论是在用户/系统级别还是在pythonenv风格的环境中。当然,这可能是非常困难和耗时的,这取决于您必须修改多少代码来适应这一点,建议您在项目开始时尝试这样做,以避免这一头痛问题

除了做那个些不寻常的工作之外,我实际上遇到了你们在Amazon的EC2 LTS ubuntu上遇到的这个特定错误。不知道是什么原因造成的,但它就像python一样,只是绕过了正常的环境设置,并没有像您所期望的那样工作。在我的情况下,我只是做了一些肮脏的修正:

import os

os.environ['PYTHONPATH'] = '{}:{}'.format('my/addition/to/pythonpath', os.environ.get('PYTHONPATH', ''))
print(os.environ['PYTHONPATH'])
# prints my/addition/to/pythonpath:existing/things/on/pythonpath

因此,对于您的用例,请尝试:

import os

os.environ['PYTHONPATH'] = '{}:{}'.format('/home/ec2-user/efs/Day-Trader/day_trader/', os.environ.get('PYTHONPATH', ''))
print(os.environ['PYTHONPATH'])
# prints /home/ec2-user/efs/Day-Trader/day_trader/:

当然,你可以用这个做一些非常讨厌的事情,比如:

python -c "import os; os.environ['PYTHONPATH'] = '/my/addition/to/pythonpath'; import mymodule; mymodule.doThing()'

如果出于某种原因,你不喜欢每一个不喜欢与此合作的人。撇开玩笑不谈,我真的在生产中使用过类似的东西,如果你能弄清楚到底是什么导致了这些环境问题,我很想知道,即使我不再在有这些问题的机器上工作

相关问题 更多 >

    热门问题