2016-01-20 10 views
6

私は多くのPythonパッケージを持っています。私の同僚から書いたもので、依存している第3のパッケージを確認するツールを書いています。すべてのサードパーティパッケージとその機能をPythonファイルで使用する

この

#it is my package, need to check,call it example.py 
#We have more than one way to import a package, It is a problem need to consider too 

from third_party_packages import third_party_function 

def my_function(arg): 
    return third_party_function(arg) 

同様

とツールが、私はそれを行う方法見当がつかないこの

result = tool(example.py) 
#this result should be a dict like this structure 
#{"third_party_function":["my_function",]} 
#Means "my_function" relies on "third_party_function" 

のように動作するはずですが、すべての私は、このツールの実装を考え出すことができるPythonのファイルを読まれます文字列として1行ずつ入力し、正規表現を使用して比較します。 あなたは私にいくつかアドバイスをくれますか?

あなたは私が何を意味するかわからない場合は、 あなたの質問をコメントしてください、私はできるだけ早くそれを修正します。 ありがとう!

+1

あなたはつまり、あなたが 'ピップ凍結'のようなpip'を使用することができますPythonインストールにインストールされているすべてのパッケージ作業環境をお持ちの場合>ファイル 'requirements.pip'を作成するためのrequirements.pip'(間接的にパッケージあなたのプロジェクトを実行する必要があります) –

+0

これは簡単な質問ではありません。 –

+0

あなたの助言をありがとう、残念ながら、ピップによってインストールされたすべてのパッケージではなく、いくつかのパッケージが自分で書きました。私はそれらに対処する必要があります。 – Fudun

答えて

3

あなたはastモジュールを使用してファイルを解析し、すべてのImportImportFrom文を確認することができます。あなたのアイデアを与えることを

は、ここでの例です:

>>> import ast 
>>> tree = ast.parse('import a; from b import c') 
>>> tree.body 
[<_ast.Import object at 0x7f3041263860>, <_ast.ImportFrom object at 0x7f3041262c18>] 
>>> tree.body[0].names[0].name 
'a' 
>>> tree.body[1].module 
'b' 
>>> tree.body[1].names[0].name 
'c' 

あなたのスクリプトは次のように仕事ができる:

  1. ast.walk()
  2. を使用して ast.parse
  3. 訪問を経由して各ノードをソースファイルを解析します
  4. ノードがImportまたはImportFromのオブジェクトの場合は、名前を調べて所有しているものを実行しますする。

astを使用すると、正規表現やカスタムパーサーよりはるかに簡単で強力です。インストールされたすべてのパッケージをリスト

+0

はどうもありがとう、そしてそれは私のための仕事のように見えます[どのようにpy2exeはあなたが必要なモジュールか決めていますか?](http://www.py2exe.org/index.cgi/FAQ#How_does_py2exe_decide_which_modules_you_need.3F)を参照してください私たちはすぐにオフィスに到着〜私は結果を投稿します〜 – Fudun

+0

それは私のために働く!あなたsooooooooooooooooooooooありがとう! – Fudun

関連する問題