Python - 如何在另一个模块中调用一个模块的main函数?
Python - How to call the main fuction of a module in another module?
我正在尝试编写一个 python 模块,在其主要功能中调用另一个模块的主要功能。
我写的模块叫做Trial.py,包含要调用的函数的模块叫做print_all.py
。
print_all.py 是一个模块,是一个名为 mrtparse 的库。图书馆可以找到 here.
请注意,当我 运行 print_all.py
在 Linux shell 中时,它需要一个文件 (.gz) 作为参数,如下所示
$ python print_all.py updates.gz
Trial.py
看起来像这样:
from mrtparse import *
import gzip
import print_all
import os
from urllib2 import urlopen, URLError, HTTPError
def fn1():
Bla Bla
def fn2():
Bla Bla
def main():
mrtparse.print_all.main(updates.gz) //I want to do something like this
if __name__ == '__main__':
main()
所有模块和要作为参数传递的文件都在同一目录中。
看起来很容易做的事情,但我很难做到。
您可以在脚本中将 main() 中的主函数 运行 放在 else 语句中,而不是 if name 然后将其导入您的脚本中只是 运行.
if __name__=='__main__':
pass
else:
main()
由于您要单独导入模块 print_all,因此您可以调用 print_all.main()。
更新:我刚刚查看了模块 print_all.py。第一个参数将假定为文件本身的名称 (print_all)。所以 updates.gz 必须是第二个参数。还要确保使用引号,因为您传递的是字符串。
因此您的代码将是:
from mrtparse import *
import gzip
import print_all
import os
from urllib2 import urlopen, URLError, HTTPError
def fn1():
Bla Bla
def fn2():
Bla Bla
def main():
print_all.main('print_all.py updates.gz')
if __name__ == '__main__':
main()
我想,你应该使用:
# ...
import print_all
# ...
def main():
print_all.main("updates.gz")
老实说,print_all — 不是模块,您无法从任何地方导入它。请注意,examples
文件夹中没有 __init__.py
。
否则,您将可以使用 mrtparse.examples.print_all
。
但是现在 mrtparse
在 examples
.
中看不到任何东西
因此,您可以将 print_all
-script 放在您的脚本附近,然后像我上面显示的那样使用它。
之后
print_all 中的主函数没有参数。
它从命令行参数获取数据。
我觉得,你有两个办法:
- 错误 — 补丁
sys.argv
;
- 正确 — 从
print_all
. 重写 main
补丁sys.argv(糟糕的方式)
import sys
sys.argv = sys.argv = [sys.argv[0], 'updates.gz']
# ...
import print_all
# ...
def main():
print_all.main()
# ...
重写 main()
Post 这个函数变成 print_all
并用它代替 main
.
def do_work(filename):
d = Reader(filename)
# if you want to use 'asdot+' or 'asdot' for AS numbers,
# comment out either line below.
# default is 'asplain'.
#
# as_repr(AS_REPR['asdot+'])
# as_repr(AS_REPR['asdot'])
for m in d:
m = m.mrt
print('---------------------------------------------------')
if m.err == MRT_ERR_C['MRT Header Error']:
prerror(m)
continue
print_mrt(m)
if m.err == MRT_ERR_C['MRT Data Error']:
prerror(m)
continue
if m.type == MRT_T['TABLE_DUMP']:
print_td(m)
elif m.type == MRT_T['TABLE_DUMP_V2']:
print_td_v2(m)
elif ( m.type == MRT_T['BGP4MP']
or m.type == MRT_T['BGP4MP_ET']):
print_bgp4mp(m)
正确的方式
将 do_work
放在您自己的模块中或代码中的任何其他位置。
之后,例如,您的文件将如下所示:
import sys
from optparse import OptionParser
from datetime import *
from mrtparse import *
from print_all import *
import gzip
import print_all
import os
from urllib2 import urlopen, URLError, HTTPError
def fn1():
Bla Bla
def fn2():
Bla Bla
def do_work(filename):
d = Reader(filename)
# if you want to use 'asdot+' or 'asdot' for AS numbers,
# comment out either line below.
# default is 'asplain'.
#
# as_repr(AS_REPR['asdot+'])
# as_repr(AS_REPR['asdot'])
for m in d:
m = m.mrt
print('---------------------------------------------------')
if m.err == MRT_ERR_C['MRT Header Error']:
prerror(m)
continue
print_mrt(m)
if m.err == MRT_ERR_C['MRT Data Error']:
prerror(m)
continue
if m.type == MRT_T['TABLE_DUMP']:
print_td(m)
elif m.type == MRT_T['TABLE_DUMP_V2']:
print_td_v2(m)
elif ( m.type == MRT_T['BGP4MP']
or m.type == MRT_T['BGP4MP_ET']):
print_bgp4mp(m)
def main():
do_work('updates.gz')
if __name__ == '__main__':
main()
我正在尝试编写一个 python 模块,在其主要功能中调用另一个模块的主要功能。
我写的模块叫做Trial.py,包含要调用的函数的模块叫做print_all.py
。
print_all.py 是一个模块,是一个名为 mrtparse 的库。图书馆可以找到 here.
请注意,当我 运行 print_all.py
在 Linux shell 中时,它需要一个文件 (.gz) 作为参数,如下所示
$ python print_all.py updates.gz
Trial.py
看起来像这样:
from mrtparse import *
import gzip
import print_all
import os
from urllib2 import urlopen, URLError, HTTPError
def fn1():
Bla Bla
def fn2():
Bla Bla
def main():
mrtparse.print_all.main(updates.gz) //I want to do something like this
if __name__ == '__main__':
main()
所有模块和要作为参数传递的文件都在同一目录中。 看起来很容易做的事情,但我很难做到。
您可以在脚本中将 main() 中的主函数 运行 放在 else 语句中,而不是 if name 然后将其导入您的脚本中只是 运行.
if __name__=='__main__':
pass
else:
main()
由于您要单独导入模块 print_all,因此您可以调用 print_all.main()。
更新:我刚刚查看了模块 print_all.py。第一个参数将假定为文件本身的名称 (print_all)。所以 updates.gz 必须是第二个参数。还要确保使用引号,因为您传递的是字符串。
因此您的代码将是:
from mrtparse import *
import gzip
import print_all
import os
from urllib2 import urlopen, URLError, HTTPError
def fn1():
Bla Bla
def fn2():
Bla Bla
def main():
print_all.main('print_all.py updates.gz')
if __name__ == '__main__':
main()
我想,你应该使用:
# ...
import print_all
# ...
def main():
print_all.main("updates.gz")
老实说,print_all — 不是模块,您无法从任何地方导入它。请注意,examples
文件夹中没有 __init__.py
。
否则,您将可以使用 mrtparse.examples.print_all
。
但是现在 mrtparse
在 examples
.
因此,您可以将 print_all
-script 放在您的脚本附近,然后像我上面显示的那样使用它。
之后
print_all 中的主函数没有参数。 它从命令行参数获取数据。
我觉得,你有两个办法:
- 错误 — 补丁
sys.argv
; - 正确 — 从
print_all
. 重写 main
补丁sys.argv(糟糕的方式)
import sys
sys.argv = sys.argv = [sys.argv[0], 'updates.gz']
# ...
import print_all
# ...
def main():
print_all.main()
# ...
重写 main()
Post 这个函数变成 print_all
并用它代替 main
.
def do_work(filename):
d = Reader(filename)
# if you want to use 'asdot+' or 'asdot' for AS numbers,
# comment out either line below.
# default is 'asplain'.
#
# as_repr(AS_REPR['asdot+'])
# as_repr(AS_REPR['asdot'])
for m in d:
m = m.mrt
print('---------------------------------------------------')
if m.err == MRT_ERR_C['MRT Header Error']:
prerror(m)
continue
print_mrt(m)
if m.err == MRT_ERR_C['MRT Data Error']:
prerror(m)
continue
if m.type == MRT_T['TABLE_DUMP']:
print_td(m)
elif m.type == MRT_T['TABLE_DUMP_V2']:
print_td_v2(m)
elif ( m.type == MRT_T['BGP4MP']
or m.type == MRT_T['BGP4MP_ET']):
print_bgp4mp(m)
正确的方式
将 do_work
放在您自己的模块中或代码中的任何其他位置。
之后,例如,您的文件将如下所示:
import sys
from optparse import OptionParser
from datetime import *
from mrtparse import *
from print_all import *
import gzip
import print_all
import os
from urllib2 import urlopen, URLError, HTTPError
def fn1():
Bla Bla
def fn2():
Bla Bla
def do_work(filename):
d = Reader(filename)
# if you want to use 'asdot+' or 'asdot' for AS numbers,
# comment out either line below.
# default is 'asplain'.
#
# as_repr(AS_REPR['asdot+'])
# as_repr(AS_REPR['asdot'])
for m in d:
m = m.mrt
print('---------------------------------------------------')
if m.err == MRT_ERR_C['MRT Header Error']:
prerror(m)
continue
print_mrt(m)
if m.err == MRT_ERR_C['MRT Data Error']:
prerror(m)
continue
if m.type == MRT_T['TABLE_DUMP']:
print_td(m)
elif m.type == MRT_T['TABLE_DUMP_V2']:
print_td_v2(m)
elif ( m.type == MRT_T['BGP4MP']
or m.type == MRT_T['BGP4MP_ET']):
print_bgp4mp(m)
def main():
do_work('updates.gz')
if __name__ == '__main__':
main()