从外部脚本

时间:2017-11-06 02:15:06

标签: python sys

我有两个与我合作的脚本。第一个,Script1.py,通过在for循环中传递参数来导入Script2.py并使用其main()

    for ipNum in ipList:
        print("Checking databases for: " + ipNum)
        Script2.main("--ip " + ipNum)

然而,当运行Script1.py时,我得到了erorr:

vol.py: error: unrecognized arguments: --profile=WinXPSP3x86 -f B:/vmem/zeus.vmem connscan

main()在Script2.py中是这样的:

def main(args):
    parser = argparse.ArgumentParser(description='Is This IP Bad?')
    parser.add_argument('-i', '--ip', help='IP address to check')
    parser.add_argument('--success', help='Also display GOOD', required=False, action="store_true")
    args = parser.parse_args()

    if args is not None and args.ip is not None and len(args.ip) > 0:
        badip = args.ip
    else:
        my_ip = urlopen('http://icanhazip.com').read().rstrip()

无法识别的参数当然是在launchung script1时输入的命令行参数。如何通过单个参数列表适当地枚举多次运行script2 main()?

2 个答案:

答案 0 :(得分:0)

我认为最好在顶级'中进行所有argparse处理。每个.py文件,只有当该文件作为脚本运行时才执行,而不是从elsehwere导入/调用它。然后你不必关心被叫脚本'消费'你的一些命令行参数,如果看到意外的参数,就会窒息。

因此可能作为带有命令行参数的脚本运行的每个.py文件看起来像这样:

import x
import y
import argparse

def main(a, b, c):
    some code

if __name__ == '__main__':
   parser = argparse.ArgumentParser(description='a desc')
   parser.add_argument('--a') 
   parser.add_argument('--b') 
   parser.add_argument('--c') 
   args = parser.parse_args()
   main(args.a, args.b, args.c) 

尝试将argparse内容移出Script2中的main()函数,并使用Script1中的常规参数调用main():

def main(ip=None, Sucess=None): 
   if ip is None: 
      ip=urlopen('http://icanhazip.com').read().rstrip()


If __name__ == '__main__':
   parser = argparse.ArgumentParser(description='Is This IP Bad?')
   parser.add_argument('-i', '--ip', help='IP address to check') 
   parser.add_argument('--success', help='Also display GOOD', required=False, action="store_true")
   args = parser.parse_args()
   main(args.ip, args.success)

然后从另一个脚本调用类似的东西:

for ipNum in ipList: 
    print("Checking databases for: {}".format(ipNum))
    Script2.main(ipNum)

答案 1 :(得分:0)

如果只从Script1.py调用Script2.py,则在Script2中使用argparse是最重要的。相反,将相关方法从Script2导入Script1并使用它们,就好像它们位于同一名称空间中一样(因为现在它们都是)。

如果需要,Script1可以使用argparse从命令行获取内容,并将它们传递给Script2。这允许Script2专注于ip相关的行为,而Script1可以专注于用户交互。

SHOW_AS_ACTION_ALWAYS