Python 仅当“名称”为“名称”时,才从setuptools运行设置功能__主要的;?

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()调用中使用) 这可能吗?不允许?气馁?为什么? 我找不到任何关于这方面的文档,但奇怪的是,所有示

仅当模块实际运行时,我才希望在setup.py中运行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。这使得这个函数更加有用