Python命令行传参与模块调用传参详解
本文介绍如何利用Python的argparse模块实现命令行传参,以自动化实验流程。同时针对模块调用时参数传递失效的问题,深入分析因字符串常量覆盖变量导致的错误,并提供相应的解决方案与代码示例,帮助开发者避免常见陷阱。
最近进行实验时,我遇到了一个效率问题。
由于实验涉及的数据集数量较多,每次运行完一个数据集后,都需要手动修改文件路径,将文件传输至服务器,然后再执行实验。这种操作方式效率极低,必须全程监控实验进度,待其结束后手动修改配置以运行下一个实验。这种低效的工作流程让我无法接受,因此我在思考是否有更好的解决办法。
我们期望的解决方案是通过命令行传参来实现自动化。因为后续需要编写Shell脚本来批量运行实验,如果使用传统的输入语句方式显得过于笨拙且不够灵活。
在编写实验代码时,我将所有参数集中管理在一个Python文件中,以便于后期维护。现在的关键问题是如何通过命令行传参的方式,动态修改该文件中的某些特定值。
关于传参功能,Python提供了argparse模块。借助该模块,我们可以快速实现命令行参数的解析与传递。
下面通过一个具体示例进行说明。
文件test1.py
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
import test1
str = test1.name + 'asdasdasd'
文件test2.py
import test3
print test3.str
运行方式如下:

我们可以通过修改命令行参数来改变name变量的值。从原理上理解,这相当于Python将这三份代码拼接在一起并统一执行。
这样便实现了我之前提到的功能需求。
补充说明:Python调用模块时传参出错的解决方案。
首先定义了一个Login模块。
该模块接收两个参数:username和password。
#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类中调用该模块的代码如下:
#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"),那么它就不再是变量,而是常量。当你调用该模块时,即使传入了参数,它依然会按照模块内部设置的固定字符串(即"username"和"password")进行运行。
以上为个人经验分享,希望能给大家提供参考。也希望大家多多支持本站。如有错误或未考虑周全之处,望不吝赐教。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









