【问题标题】:How to modify a python script so it takes arguments from the command line如何修改 python 脚本,使其从命令行获取参数
【发布时间】:2025-12-07 14:15:01
【问题描述】:

我在 python 脚本中有一个函数和一些参数,但我想更改脚本,以便在从命令行调用它时,可以输入新参数。我知道我需要使用 sys 模块,但我以前没有用过太多,而且我遇到了麻烦。这是我想用命令行中 r、a、z 和 e 的参数重新创建的原始代码:

import scipy as sc 
import scipy.integrate as integrate

def dCR_dt(pops, t=0):

    R = pops[0]
    C = pops[1]
    dRdt = r * R - a * R * C
    dCdt = -z * C + e * a * R * C

    return sc.array([dRdt, dCdt])

r = 1
a = 0.1
z = 1.5
e = 0.75

t = sc.linspace(0, 15, 1000)
R0 = 10
C0 = 5
RC0 = sc.array([R0, C0])
pops, infodict = integrate.odeint(dCR_dt, RC0, t, full_output = True)

这是我迄今为止尝试做的:

import scipy as sc
import scipy.integrate as integrate
import sys

def main(r, a, z, e):
    def dCR_dt(pops, t=0):
        R = pops[0]
        C = pops[1]
        dRdt = r * R - a * R * C
        dCdt = -z * C + e * a * R * C

        return sc.array([dRdt, dCdt])

t = sc.linspace(0, 15, 1000)
R0 = 10
C0 = 5
RC0 = sc.array([R0, C0])
pops, infodict = integrate.odeint(dCR_dt, RC0, t, full_output = True)

if (__name__ == "__main__"):
    status = main(sys.argv)
    sys.exit(status)

当我尝试在命令行中使用 4 个新参数运行它时,出现以下错误:

Traceback(最近一次调用最后一次): 文件“practicesys.py”,第 31 行,在 流行音乐,infodict = 集成.odeint(dCR_dt,RC0,t,full_output = True) NameError: 名称 'dCR_dt' 未定义

我是编码新手,想了解更多关于如何使用 sys 模块来修改 scipts。任何帮助深表感谢!谢谢你,我希望大家周末愉快:)

【问题讨论】:

  • 未定义名称问题与问题无关。您还需要将t = ...pops, infodict = ... 的代码放在main() 下。 IE。缩进这个代码块。此外,您需要像这样调用 main:status = main(*sys.argv)。如果您的main() 接受可变数量的参数,那也会更好。否则,如果没有提供四个参数,它会崩溃。说def main(*args)。请参阅*.com/q/36901/2311167 了解更多信息。

标签: python arguments command-line-arguments sys


【解决方案1】:

您的代码中有许多不相关的问题。让我们只关注您真正想要询问的部分。

def main(r, a, z, e):
    return stuff

if __name__ == "__main__":  # the parentheses were unnecessary and unidiomatic
    status = main(sys.argv)
    sys.exit(status)

这里有两个问题。首先,sys.argv[0] 包含您的脚本名称;所以你想使用sys.argv[1:] 来引用命令行参数。其次,您将单个参数传递给需要四个参数的函数。你当然可以说

    status = main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])

但是 Python 有一个方便的简写方式来表示“使用这个列表作为参数”:

    status = main(*sys.argv[1:])

更根本的是,您应该修改您的函数,使其不使用任何全局变量。

def dCR_dt(pops, t=0, r, a, z, e):
    R = pops[0]
    C = pops[1]
    dRdt = r * R - a * R * C
    dCdt = -z * C + e * a * R * C

    return sc.array([dRdt, dCdt])

并可能将其余逻辑移至main

def main(r, a, z, e):
    t = sc.linspace(0, 15, 1000)
    R0 = 10
    C0 = 5
    RC0 = sc.array([R0, C0])
    pops, infodict = integrate.odeint(dCR_dt, RC0, t, full_output=True)

我对您的问题域了解不多,无法理解main 应该是return。您将值传递给sys.exit,因此它应该是介于 0 和 255 之间的整数,其中零表示成功,其他所有值表示错误。也许将结果print 并简单地返回 0` 会更有意义?

(另外,您的函数似乎没有使用 t 做任何事情。)

【讨论】: