繁体   English   中英

解析setup.py而不使用setuptools

[英]Parse setup.py without setuptools

我在我的ipad上使用python,需要一种方法从软件包setup.py中获取名称,版本,软件包等。 我无权访问setuptools或distutils。 起初我以为我会解析setup.py,但这似乎不是答案,因为有很多方法可以将args传递给setup()。 我想创建一个模拟setup()来返回传递给它的args,但我不确定如何通过导入错误。 任何帮助将不胜感激。

不开玩笑。 这适用于python 3.4.3和2.7.6;)

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

setup.py的内容:

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'],
)

您可以动态创建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,), {})

完成上述操作后,您将拥有一个setuptools模块,其中包含一个setup功能。 您可能需要创建一些其他函数才能使所有导入工作。 之后,您可以导入setup.py并收集内容。 话虽这么说,一般来说这是一个棘手的方法,因为setup.py可以包含任何带有条件导入和动态计算的Python代码,以便将值传递给setup()

您可以像这样替换setuptools包的setup方法

>>> import setuptools
>>> def setup(**kwargs):
        print(kwargs)
>>> setuptools.setup = setup
>>> content = open('setup.py').read()
>>> exec(content)

解析setup.py可能很危险,如果是这样的恶意文件:

from setuptools import setup
import shutil

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

我准备了一个简单的脚本 (基于@ simeon-visser的想法)和docker image,它在一个隔离的安全容器中解析setup.py文件:

用法

$ 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 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM