Python: 从脚本中调用函数
Python: Call functions out of a script
假设我有以下示例脚本:
#!/usr/bin/python
import sys
def hello():
return "Hello, I am a script!"
def bye():
return "Hope to see you again!"
如果我从命令行调用此脚本 python example.py
我如何访问 hello()
and/or bye()
.
我只知道如何调用这样的函数:
if __name__ == '__main__':
hello()
回复评论:
- 所以没有办法从命令行中选择使用哪个函数?
- 我只是想要一个包含两个不同 table 比较函数的脚本,并且能够从一个脚本中选择要使用的脚本
您不能直接调用脚本中的函数并带有脚本参数,您必须自己处理命令行参数然后调用函数:
#!/usr/bin/python
import sys
def hello():
return "Hello, I am a script!"
def bye():
return "Hope to see you again!"
if __name__ == '__main__':
for arg in sys.argv[1:]:
if arg == "hello":
print hello()
elif arg == "bye":
print bye()
当然,您可能希望以多种方式扩展它:仅处理第一个参数(本示例处理所有参数),将参数小写,以便 HELLO
和 BYE
也工作,或者如果没有给出参数,可能会显示一些帮助。
正如@bufh 所提到的,如果您的命令行参数将变得比这复杂得多,那么您可能需要查看一个可以为您处理它的库,例如 argparse
.
您可以:
python -c 'import example;example.hello()'
python -c '__import__("example").hello()'
无论您问这个问题的原因是什么(其他作者会告诉您使用 optparse or argparse, ... like they are doing in the stdlib [timeit or json] 通常是更好的主意),它 是 可能的。
一种快速而肮脏的方法是:
import sys
def hello():
print "Hello world"
def goodbye():
print "Goodbye, cruel world!"
if __name__ == "__main__":
func_name = sys.argv[1]
func = globals()[func_name]
func()
然后你可以运行myscript.py hello
或myscript.py goodbye
,当你添加其他global/top级别的功能时,它们会立即起作用。
更好的方法是使用 argparse
甚至 https://docs.python.org/dev/library/argparse.html#sub-commands
假设我有以下示例脚本:
#!/usr/bin/python
import sys
def hello():
return "Hello, I am a script!"
def bye():
return "Hope to see you again!"
如果我从命令行调用此脚本 python example.py
我如何访问 hello()
and/or bye()
.
我只知道如何调用这样的函数:
if __name__ == '__main__':
hello()
回复评论:
- 所以没有办法从命令行中选择使用哪个函数?
- 我只是想要一个包含两个不同 table 比较函数的脚本,并且能够从一个脚本中选择要使用的脚本
您不能直接调用脚本中的函数并带有脚本参数,您必须自己处理命令行参数然后调用函数:
#!/usr/bin/python
import sys
def hello():
return "Hello, I am a script!"
def bye():
return "Hope to see you again!"
if __name__ == '__main__':
for arg in sys.argv[1:]:
if arg == "hello":
print hello()
elif arg == "bye":
print bye()
当然,您可能希望以多种方式扩展它:仅处理第一个参数(本示例处理所有参数),将参数小写,以便 HELLO
和 BYE
也工作,或者如果没有给出参数,可能会显示一些帮助。
正如@bufh 所提到的,如果您的命令行参数将变得比这复杂得多,那么您可能需要查看一个可以为您处理它的库,例如 argparse
.
您可以:
python -c 'import example;example.hello()'
python -c '__import__("example").hello()'
无论您问这个问题的原因是什么(其他作者会告诉您使用 optparse or argparse, ... like they are doing in the stdlib [timeit or json] 通常是更好的主意),它 是 可能的。
一种快速而肮脏的方法是:
import sys
def hello():
print "Hello world"
def goodbye():
print "Goodbye, cruel world!"
if __name__ == "__main__":
func_name = sys.argv[1]
func = globals()[func_name]
func()
然后你可以运行myscript.py hello
或myscript.py goodbye
,当你添加其他global/top级别的功能时,它们会立即起作用。
更好的方法是使用 argparse
甚至 https://docs.python.org/dev/library/argparse.html#sub-commands