最近跑实验,遇到了一个问题:
由于实验数据集比较多,每次跑完一个数据集就需要手动更改文件路径,再将文件传到服务器,再运行实验,这样的话效率很低,必须要专门看着这个实验,啥时候跑完就手动修改运行下一个实验。我个人无法忍受这样低效率,就想能不能有什么解决的办法。
我们期望的解决办法是通过命令行传参来解决这个问题,因为接下来是需要编写shell脚本来批量运行实验,如果用输入语句的方式显得太笨拙。
在编写实验代码的时候,我将所有的参数集中到一个py文件中,这样便于后期的维护,现在的问题就是需要通过命令行传参的方式改变该文件中的某些值。
关于传参,python中提供了argparse这一模块。通过这个模块 就能很快的实现命令行传参的功能。
下面举个例子:
文件test1.py
1
2
3
4
5
6
7
8
|
import argparse
from argparse import rawtexthelpformatter
parse = argparse.argumentparser(description = "the parameters for the feature select method" , formatter_class = rawtexthelpformatter)
parse.add_argument( 'name' , type = str )
args = parse.parse_args()
name = args.name
|
文件test3.py
1
2
|
import test1
str = test1.name + 'asdasdasd'
|
文件test2.py
1
2
|
import test3
print test3. str
|
运行:
我们可以通过改变命令行的参数来改变这个name的值,其实关于这一点也比较好理解,我们可以想成python将这三份代码拼接在一起,再一起执行。
这样就实现了我刚才想要的功能。
补充:python调用模块时传参出错的解决方案
首先定义了一个login模块
传参是两个:username,password
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#coding=utf-8
def login( self ,username,password):
driver = self .driver
self .driver.implicitly_wait( 30 ) #不加等待会出错
driver.switch_to.frame( 0 )
driver.find_element_by_class_name( "dlemail" ).clear()
driver.find_element_by_class_name( 'dlemail' ).send_keys( "username" )
driver.find_element_by_class_name( 'dlpwd' ).clear()
driver.find_element_by_class_name( 'dlpwd' ).send_keys( "password" )
driver.find_element_by_id( "dologin" ).click()
def logout( self ):
driver = self .driver
driver.find_element_by_link_text(u "退出" ).click()
driver.quit()
|
在test.login中调用该模块:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#coding=utf-8
from selenium import webdriver
import unittest,time
from public import login
class testlogin(unittest.testcase):
def setup( self ):
self .driver = webdriver.chrome()
self .driver.implicitly_wait( 30 )
self .base_url = "http://www.126.com/"
self .verificationerrors = []
def test_login( self ):
driver = self .driver
driver.get( self .base_url)
login.login( self , "jinbian3333" , "jinbian76" ) #传参是这两个
text = driver.find_element_by_id( "spnuid" ).text
self .assertequal(text, "jinbian3333@126.com" )
login.logout( self )
def teardown( self ):
self .driver.quit()
self .assertequal([], self .verificationerrors)
if __name__ = = '__main__' :
unittest.main()
|
可是运行后发现出错:
明明传参是"jinbian3333","jinbian76",为什么登录信息是图中呢?
回头查看被调用模块,
按我理解就是 加了" " 就不是变量了,是常量了, 你调用了该模块,即使传参 它还是按照模块本身的设置:“username”"password"运行
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://www.cnblogs.com/mlgjb/p/10739112.html