簡體   English   中英

在 EC2 實例 (AWS) 上使用 Bash 腳本導入錯誤加載模塊

[英]Import Error Loading Module using Bash Script on EC2 Instance (AWS)

我正在嘗試通過 spot_fleet_request 方法的 user_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”。 我已嘗試按照本文中的建議將目錄分配給 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 終端並完美運行並生成所有正確的 output。 所以我想,如果我按照這篇文章中的建議更改 bash 腳本頂部的用戶,它可能會起作用,但以下命令仍然以 root 身份運行以下所有內容:

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

我嘗試使用運行 python 腳本

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

但它也沒有用。 我沒主意了。 請幫忙。

我認為推薦的方法當然是嘗試將您的代碼 package 作為適當的模塊,並在用戶/系統級別或 pythonenv 樣式環境中使用 pip 之前安裝它。 當然,這可能非常困難和耗時,具體取決於您必須更改多少代碼以適應這種情況,並且建議您在開始制作項目時嘗試這樣做以避免這種頭痛。

雖然沒有做大量的工作,但我實際上遇到了您在 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()'

如果出於某種原因,您不喜歡所有對此感到不滿的人。 撇開笑話不談,我確實在生產中使用過這樣的東西,如果你們都弄清楚到底是什么導致了這些環境問題,即使我不再在有這些問題的機器上工作,我也很想知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM