Python如何在另一个模块中调用主函数?

2024-10-02 16:33:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个python模块,它在main函数中调用另一个模块的main函数。在

我正在编写的模块名为试用版.py包含要调用的函数的模块称为print_all.py。在

打印_全部.py是一个名为mrtparse的库。可以在here找到该库。在

注意,当我在linuxshell中运行print_all.py时,它需要一个文件(.gz)作为参数,如下所示

$ python print_all.py updates.gz

Trial.py如下所示:

^{pr2}$

所有要作为参数传递的模块和文件都在同一目录中。 这似乎是件容易做的事,但我却很难做到。在


Tags: 模块文件函数py参数heremainall
3条回答

您可以在脚本中从else语句的place main()而不是ifname中运行main函数,然后将其导入脚本并运行。在

if __name__=='__main__':
     pass
else:
     main()

由于要单独导入print_模块,因此可以调用print_全部.main(). 在

更新:我刚看了模版印刷品_全部.py. 第一个参数将假定为文件本身的名称(print_all)。所以更新.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_中的Main函数都没有参数。 它从命令行参数获取数据。在

我想,你有两种方法:

  • 错误-补丁sys.argv
  • print_all重写main。在

补丁系统argv(坏方法)

^{pr2}$

重写main()

将此函数发布到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放入您自己的模块或代码中的任何其他位置。 例如,在此之后,yout文件将如下所示:

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()

相关问题 更多 >