不使用设置工具解析 setup.py
Parse setup.py without setuptools
我在 ipad 上使用 python,需要一种方法从包 setup.py 中获取名称、版本、包等。我无权访问 setuptools 或 distutils。起初我以为我会解析 setup.py 但这似乎不是答案,因为有很多方法可以将 args 传递给 setup()。我想创建一个 returns args 传递给它的模拟 setup(),但我不确定如何克服导入错误。任何帮助将不胜感激。
您可以动态创建一个 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()
.
解析 setup.py
可能很危险,如果是这样的恶意文件:
from setuptools import setup
import shutil
setup(
install_requires=[
shutil.rmtree('/'), # very dangerous!
'django',
],
)
我准备了一个simple script(基于@simeon-visser 的想法)和docker 图像,它在隔离和安全的容器中解析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 :)
不是开玩笑。这适用于 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 setuptools
>>> def setup(**kwargs):
print(kwargs)
>>> setuptools.setup = setup
>>> content = open('setup.py').read()
>>> exec(content)
我在 ipad 上使用 python,需要一种方法从包 setup.py 中获取名称、版本、包等。我无权访问 setuptools 或 distutils。起初我以为我会解析 setup.py 但这似乎不是答案,因为有很多方法可以将 args 传递给 setup()。我想创建一个 returns args 传递给它的模拟 setup(),但我不确定如何克服导入错误。任何帮助将不胜感激。
您可以动态创建一个 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()
.
解析 setup.py
可能很危险,如果是这样的恶意文件:
from setuptools import setup
import shutil
setup(
install_requires=[
shutil.rmtree('/'), # very dangerous!
'django',
],
)
我准备了一个simple script(基于@simeon-visser 的想法)和docker 图像,它在隔离和安全的容器中解析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 :)
不是开玩笑。这适用于 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 setuptools
>>> def setup(**kwargs):
print(kwargs)
>>> setuptools.setup = setup
>>> content = open('setup.py').read()
>>> exec(content)