Python - 如何在另一个模块中调用模块的主要功能?

时间:2016-02-18 02:26:12

标签: python import arguments main

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

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

print_all.py是一个名为mrtparse的库。可以找到该库here

请注意,当我在Linux shell中运行print_all.py时,它需要一个文件(.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()

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

3 个答案:

答案 0 :(得分:0)

你可以在脚本中想要在else语句中的main()处运行main函数,而不是if name 然后在脚本中导入它并运行。

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

答案 1 :(得分:0)

由于您要单独导入模块print_all,因此可以调用print_all.main()。

更新:我刚看了模块print_all.py。第一个参数将被假定为文件本身的名称(print_all)。所以updates.gz必须是第二个参数。还要确保使用引号,因为传入的是字符串。

所以你的代码将是:

    System.out.println("max-" + func(0, 0));  // -> max-8186

答案 2 :(得分:0)

我想,你应该使用:

# ...

import print_all

# ...

def main():
    print_all.main("updates.gz") 

老实说,print_all - 不是模块,你不能从任何地方导入它。请注意,__init__.py - 文件夹中没有examples。 否则,您将可以使用mrtparse.examples.print_all。 但现在mrtparse examples没有看到任何内容。

因此,您可以将print_all - 脚本放在您的脚本附近,并像上面显示的那样使用它。

之后

print_all中的main函数没有参数。 它从命令行参数中获取数据。

我想,你有两种方式:

  • 错误 - 补丁sys.argv;
  • 右键 - 从print_all重写主页。

补丁sys.argv(坏方法)

import sys
sys.argv = sys.argv = [sys.argv[0], 'updates.gz']

# ...

import print_all

# ...

def main():
    print_all.main() 

# ...

重写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放在您自己的模块中或代码中的任何其他位置。 之后,例如,你的文件将如下所示:

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