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。 但是现在 mrtparseexamples.

中看不到任何东西

因此,您可以将 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()