我只想将一个文件pysome.py
用作
import pysome
并在控制台中
$ pysome
在后一种情况下,我不想要调用函数, 在前一种情况下,我做了。
我有
entry_points={'console_scripts': ['pysome=pysome:main']}
。我试过了
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。
答案 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
将打破支票。这使事情变得非常容易破碎,我不建议这样做。