2015-01-06 9 views
6

私は自分のipadでpythonを使用しています。パッケージsetup.pyから名前、バージョン、パッケージなどを取得する方法が必要です。私はsetuptoolsやdistutilsにアクセスできません。最初は私はsetup.pyを解析すると思っていましたが、setup()に引数を渡す方法がたくさんあるので、これは答えには見えません。私はそれに渡されたargsを返すモックsetup()を作成したいと思いますが、インポートエラーをどのように回避するかはわかりません。どんな助けでも大歓迎です。setuptoolsのないsetup.pyを

答えて

4

あなたは動的にsetuptoolsモジュールを作成し、実際にsetupに渡された値をキャプチャすることができます。

>>> import imp 
>>> module = """ 
... def setup(*args, **kwargs): 
...  print(args, kwargs) 
... """ 
>>> 
>>> setuptools = imp.new_module("setuptools") 
>>> exec module in setuptools.__dict__ 
>>> setuptools 
<module 'setuptools' (built-in)> 
>>> setuptools.setup(3) 
((3,), {}) 

あなたはそれでsetup機能をsetuptoolsモジュールを持っている上記した後。すべてのインポートが機能するように、いくつかの関数を作成する必要があります。その後、setup.pyをインポートしてコンテンツを収集することができます。つまり、一般的にはsetup.pyに条件付きインポートと動的計算を含むPythonコードを含めて、setup()に値を渡すことができるという難しいアプローチです。 setup.pyを解析

+0

わかりやすくて賢明で、あなたは多くの時間を節約できました!) –

0

は、このような悪質なファイルの場合には、危険なことができます:

from setuptools import setup 
import shutil 

setup(
    install_requires=[ 
     shutil.rmtree('/'), # very dangerous! 
     'django', 
    ], 
) 

私は孤立してsetup.pyファイルを解析(@のシメオン・フィッセルの考えに基づいて)simple scriptとドッキングウィンドウの画像を、用意していますそして、セキュアコンテナ:

使用

$ git clone https://github.com/noisy/parse_setup.py 
$ cd parse_setup.py/ 
$ docker build -t parse . 
$ ./parse.sh ./example_files/setup.py 
#[OK] 
lxml==3.4.4 
termcolor==1.1.0 

$ ./parse.sh ./example_files/dangerous_setup.py 
[Errno 39] Directory not empty: '/usr/local/lib' 
#nothing bad happend :) 
3

冗談。これは、Python 3.4.3と2.7.6で働いていた;)setup.pyの

export VERSION=$(python my_package/setup.py --version) 

内容:

from distutils.core import setup 

setup(
    name='bonsai', 
    version='0.0.1', 
    packages=['my_package'], 
    url='', 
    license='MIT', 
    author='', 
    author_email='', 
    description='', 
    test_suite='nose.collector', 
    tests_require=['nose'], 
) 
+1

'python my_package/setup.py --name'も機能します。 –

0

をあなたはこの

>>> import setuptools 
>>> def setup(**kwargs): 
     print(kwargs) 
>>> setuptools.setup = setup 
>>> content = open('setup.py').read() 
>>> exec(content) 
よう setuptoolsパッケージの setup方法を置き換えることができます
+0

良い答えですが、opには_ _ "私は' setuptools'または 'distutils'にアクセスできません" _ –

関連する問題