![](/img/trans.png)
[英]how to call a module in a function in pp where that fuction has other functions in it?
[英]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
。 但是現在mrtparse
在examples
mrtparse
不到任何內容。
因此,您可以將print_all
-script放在腳本附近,並像上面顯示的那樣使用它。
print_all中的主函數沒有參數。 它從命令行參數獲取數據。
我認為,您有兩種方法:
sys.argv
; print_all
重寫main。 import sys
sys.argv = sys.argv = [sys.argv[0], 'updates.gz']
# ...
import print_all
# ...
def main():
print_all.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.