簡體   English   中英

Python-如何在另一個模塊中調用一個模塊的主要功能?

[英]Python - How to call the main fuction of a module in another module?

我正在嘗試編寫一個python模塊,該模塊在其main函數中調用另一個模塊的main函數。

我正在編寫的模塊稱為Trial.py,而包含要調用的功能的模塊稱為print_all.py

print_all.py是一個模塊,是一個名為mrtparse的庫。 該庫可以在這里找到。

請注意,當我在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()

所有要作為參數傳遞的模塊和文件都在同一目錄中。 看起來這很容易做,但是我卻很難受。

您可以在腳本中通過else語句中的main()來運行main函數,而不是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 -folder中沒有__init__.py 否則,您將可以使用mrtparse.examples.print_all 但是現在mrtparseexamples mrtparse不到任何內容。

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

將此函數發布到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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM