gpt4 book ai didi

python - 从外部脚本的 setup.py 导入变量

转载 作者:行者123 更新时间:2023-11-30 22:25:41 25 4
gpt4 key购买 nike

我有一个像这样的 setup.py 文件(不在 pwd 中,不在 Python 路径中,在某处的随机文件中):

import ext_modules

config = {
'name': 'mesos.executor',
'version': '1.4.1',
'description': 'Mesos native executor driver implementation',
'author': 'Apache Mesos',
'author_email': 'dev@mesos.apache.org',
'url': 'http://pypi.python.org/pypi/mesos.executor',
'namespace_packages': [ 'mesos' ],
'packages': [ 'mesos', 'mesos.executor' ],
'package_dir': { '': 'src' },
'install_requires': [ 'mesos.interface == 1.4.1' ],
'license': 'Apache 2.0',
'keywords': 'mesos',
'classifiers': [ ],
'ext_modules': [ ext_modules.executor_module ]
}

from setuptools import setup
setup(**config)

并且我想从外部(Python)脚本导入配置[“install_requires”]。我正在寻找最简单的方法来执行此操作,因为它旨在从其他脚本运行,甚至可能不是 Python。

Python 单行代码会很棒。

最佳答案

除了从任意路径导入python模块外,还需要避免执行setup(),一种方法是通过AST过滤:

import ast, _ast

def filter_setup_st(node):
if isinstance(node, _ast.Expr) and isinstance(node.value, _ast.Call):
if node.value.func.id == 'setup':
return False
return True

with open('/path/to/example_setup.py') as f:
c = f.read()
tree = ast.parse(c)
tree.body = [n for n in tree.body if filter_setup_st(n)]

ns = {}
exec(compile(tree, '__string__', 'exec'), {}, ns)

assert ns['config']['install_requires'] == ['mesos.interface == 1.4.1']

另一种方法有点棘手,暂时无效 setuptools.setup:

import setuptools
ori_setup = setuptools.setup
setuptools.setup = lambda *a, **k: 0

ns = {}
exec(compile(c, '__string__', 'exec'), {}, ns)
assert ns['config']['install_requires'] == ['mesos.interface == 1.4.1']

setuptools.setup = ori_setup
<小时/>

更新:

如果您也想要bypass import ext_modules:

import sys

class fake_ext_module():

executor_module = 'spam'

sys.modules['ext_modules'] = fake_ext_module

关于python - 从外部脚本的 setup.py 导入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47463277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com