Python命令行传参与模块调用传参详解

Hazel
Hazel
发布时间:2026-10-14 | 6人浏览过
原创

本文介绍如何利用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")进行运行。

以上为个人经验分享,希望能给大家提供参考。也希望大家多多支持本站。如有错误或未考虑周全之处,望不吝赐教。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表