2016-09-16 5 views
1

私は次のようなPythonパッケージを持っている:それは、サードパーティのライブラリからあるのでインポート - Pythonの

package/ 
├── __init__.py 
├── PyMySQL-0.7.6-py2.7.egg 
├── pymysql 
├── PyMySQL-0.7.x.pth 
└── tests.py 

フォルダ構造を変更することはできません。 .pthファイルの

内容は

import sys; sys.__plen = len(sys.path) 
./PyMySQL-0.7.6-py2.7.egg 
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) 

いただきましtests.pyにpymysqlを含めるための最良の方法

ているフォルダ名が含まれているので、私は明らかにfrom PyMySQL-0.7.6-py2.7.eggを使用することはできませんドット。

P.S.このコードはAWSラムダに展開されるため、絶対パスは不明です

+0

私は 'importlib.import_module'関数を使用しようとします。しかし、これはうまくいかず、importlib( 'myimportlib'のような名前)パッケージをコピーし、' _bootstrap._find_and_load_unlocked'のパス分割アルゴリズムを変更する必要があります。クールなプロジェクトに聞こえるが、コードを維持したくない!私はソースコードのURLを貼り付けます。これはPythonのヒントにあり、Python 3.6が必要です。 https://github.com/python/cpython/tree/master/Lib/importlib – user983716

+0

確かに私が行っていることではありません:D –

+0

問題を回避できない場合は、明らかにそれが唯一の解決策です。個人的に私はそれが素晴らしいと思うし、おそらく他の人に役立つでしょう。あなたが実装についていれば私に知らせてください。そのような機能をテストする方法を知りたいのですが。 – user983716

答えて

1

問題は、モジュールの.pthファイルが使用されていないことです。 AmazonのLambdaのビルド手順では、Lambda関数ファイルと同じルートディレクトリに依存関係をインストールしています。このディレクトリは「サイトディレクトリ」として設定されていません(例:virtualenvのlib/pythonX.Y/site-packages/、またはグローバルインストールの場合は/usr/lib/pythonX.Y/site-packages(CentOS)または/usr/local/lib/pythonX.Y/dist-packages(Ubuntu))。したがって、.pthファイルは評価されません。

現在の作業ディレクトリをサイトディレクトリとして構成できます。 The site module documentationは、カスタムサイトディレクトリを追加するための規約としてusercustomize.pyを作成すると説明していますが、Lambdaは別の問題を提示しています。自動的に評価されるため、ファイルは~/.local/lib/pythonX.Y/site-packagesにあります。私はusercustomize.pyを私のラムダ.zipファイルのルートに作成し、それを私のラムダ関数ハンドラファイルに最初にインポートしました。私はその後、ドット表記を設定するために.pthファイルを使用するモジュールをインポートすることができました。

usercustomize.py

import site 
import os 

site.addsitedir(os.getcwd()) 

lambda_handler.py

import usercustomize 
from foo.bar import baz 

この方法を使用すると、(配布zipファイルのルートにsite-packagesディレクトリへの依存関係をインストールすることができますos.getcwd()os.path.join(os.getcwd(), 'site-packages')になります)、構造が少しきれいになります。