Python setuptools:如何在导入时调用函数,但从脚本运行时不调用?

时间:2018-05-17 17:00:01

标签: python setuptools

我只想将一个文件pysome.py用作

import pysome

并在控制台中

$ pysome

在后一种情况下,我不想要调用函数, 在前一种情况下,我做了。

我有

entry_points={'console_scripts': ['pysome=pysome:main']}

在setup.py中

。我试过了

if __name__ != '__main__: some_fun()

__name__即使被称为脚本,也证明是pysome

然后我尝试制作一个包

setup.py pysome __init__.py __main__.py pysome.py

并将setup.py更改为

entry_points={'console_scripts': ['pysome=pysome.__main__:main']}

__init__.py我有

from .pysome import * some_fun()

并在__main__.py

from .pysome import *

但是当从控制台pysome运行some_fun()时仍会被调用。

在包装案例中,问题是: 如何导入pysome __main__.py而不导入__init__.py? 但是没有包装的解决方案也会很好。

使用Python 3.6。

1 个答案:

答案 0 :(得分:1)

引入垫片

我想到的最干净的解决方案是引入一个入口点填充函数,它将把调用类型信息传递给main函数。像

这样的东西
Possible Unhandled Promise Rejection (id: 0):
Error: objectType must be of type 'string', got ([object Object])
Error: objectType must be of type 'string', got ([object Object])
    at sendRequest (blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:62352:45)
    at sendRequest (blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:62385:24)
    at Object.callMethod (blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:62128:22)
    at Realm.<anonymous> (blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:61983:28)
    at blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:61408:15
    at tryCallOne (blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:16056:14)
    at blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:16157:17
    at blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:2884:21
    at _callTimer (blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:2773:9)
    at _callImmediatesPass (blob:http://localhost:8081/d198fbe8-8b32-4037-93a7-df5a46af4f15:2809:9)

在设置脚本中将入口点更改为# pysome.py def main(called_from_cli=False): if not called_from_cli: print('imported') else: print('called from cli') def _entrypoint_main(): main(called_from_cli=True)

_entrypoint_main

照常从代码中调用entry_points={'console_scripts': 'pysome=pysome:_entrypoint_main'} 。如果你想理清调用pysome.main()的情况,你可以引入一个全局标志而不是函数arg,并在垫片中打开和关闭它。

提取框架信息

您还可以检查调用者模块 - 如果是pysome.main(called_from_cli=True)脚本,则从cli调用pysome。但是,我认为main()行为在不同的解释器上有所不同,不确定这是否就是这种情况。

inspect

import inspect import os def main(): frame = inspect.stack()[1] module = inspect.getmodule(frame[0]) if module and os.path.basename(module.__file__) == 'pysome': print('called from cli') else: print('imported') 检查(不推荐)

我想您也可以在pkg_resources之前签入main(),然后再致电pkg_resources

main()

但当然只有在您的代码中不使用# pysome.py import sys def main(): if 'pkg_resources' in sys.modules.keys(): print('called from command line') else: print('called from code') 时才会有效,因此请调用

pkg_resources

将打破支票。这使事情变得非常容易破碎,我不建议这样做。