Python 仅当“名称”为“名称”时,才从setuptools运行设置功能__主要的;?
仅当模块实际运行时,我才希望在setup.py中运行setup()。所以我想做一些类似的事情:Python 仅当“名称”为“名称”时,才从setuptools运行设置功能__主要的;?,python,python-3.x,setuptools,setup.py,Python,Python 3.x,Setuptools,Setup.py,仅当模块实际运行时,我才希望在setup.py中运行setup()。所以我想做一些类似的事情: from setuptools import setup def somefunction(): ... if __name__ == "__main__": setup(...) (我想在文档构建过程中使用的另一个python脚本中使用文件中的一些已定义函数,这些函数在setup()调用中使用) 这可能吗?不允许?气馁?为什么? 我找不到任何关于这方面的文档,但奇怪的是,所有示
from setuptools import setup
def somefunction():
...
if __name__ == "__main__":
setup(...)
(我想在文档构建过程中使用的另一个python脚本中使用文件中的一些已定义函数,这些函数在setup()调用中使用)
这可能吗?不允许?气馁?为什么?
我找不到任何关于这方面的文档,但奇怪的是,所有示例都没有使用“main”的测试,所以我想知道是否有什么原因导致使用此测试有问题 应该不是问题。我建议始终使用
if\uuuuu name\uuuu==“\uuuu main\uuuu”:
条件,即使从未导入模块。另一方面,我不建议在安装脚本和项目本身的代码之间共享代码。在实践中通常不会看到setup()
调用周围的防护,因为通常不会导入此文件。众所周知,它是一个安装程序脚本,旨在直接执行
但是,您可以出于上述原因添加防护(“我想使用文件中的一些已定义函数”),distutils/setuptools中的所有功能都应该可以正常工作。在setup.py
脚本中定义库函数有些不寻常,因此您可能会问自己是否有更好的函数库,而不是直接在安装程序脚本中编写它们
这可能吗
对
不允许
没有
气馁
有点基于观点。就我个人而言,我会说是的:不要这样做
为什么?
setup.py
的任务是从,个周期开始安装代码。它通常不是其他随机任务(如构建过程文档)的总部。这个文件甚至不会包含在一个应用程序中,这可能是目前部署Python代码的更典型的方式
最后一点注意:如果您使用声明性构建系统来实现现代Python打包实践,那么就不会有
setup.py
脚本。然后,无论如何,您都必须为这些助手函数找到一个新的家 您可以采用不同的方法,将所有感兴趣的函数添加到一个单独的模块中,该模块通常可由程序的其余部分导入。我不建议将包函数放入setup.py
,因为安装文件应该位于包之外。在setup.py
中,您可能需要一个实用程序函数来按路径导入模块。我通常使用的东西如下所示:
def import_file(name, location):
"""
Imports the specified python file as a module, without explicitly
registering it to `sys.modules`.
"""
if sys.version_info[0] == 2:
# Python 2.7-
from imp import load_source
mod = load_source(name, location)
elif sys.version_info < (3, 5, 0):
# Python 3.4-
from importlib.machinery import SourceFileLoader
mod = SourceFileLoader(name, location).load_module()
else:
# Python 3.5+
from importlib.util import spec_from_file_location, module_from_spec
spec = spec_from_file_location(name, location)
mod = module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
def导入文件(名称、位置):
"""
将指定的python文件作为模块导入,而不显式
将其注册到“sys.modules”。
"""
如果系统版本信息[0]==2:
#Python 2.7-
从imp导入加载\u源
mod=加载源(名称、位置)
elif系统版本信息<(3,5,0):
#Python 3.4-
从importlib.machine导入SourceFileLoader
mod=SourceFileLoader(名称、位置).load_module()
其他:
#Python 3.5+
从importlib.util从文件位置导入规范,从规范位置导入模块
等级库=来自文件位置的等级库(名称、位置)
mod=来自规范(规范)的模块
规格加载程序执行模块(mod)
返回模式
您尝试过吗?@MisterMiyagi当然可以,但我的问题是,这可能会产生任何意外后果,例如,当setup.py在一个我不知道的上下文中运行时,它可能会在何处工作/运行,例如,已经在导入时。请澄清:我不从我的包中导入,我从repo中的另一个脚本中导入,但不是从包中导入,该包执行与文档相关的其他内部事务。@Johsm。这使得这个函数更加有用