如何将argparse参数传递给另一个Python程序?

3

我正在编写一段脚本,该脚本将把argparse参数传递给另一个Python脚本。

第一个脚本:t.py

import argparse
import subprocess
import os

commandLineArgumentParser = argparse.ArgumentParser()
commandLineArgumentParser.add_argument("-fname", "--fname",  help="first name")
commandLineArgumentParser.add_argument("-lname","--lname", help="last name")
commandLineArguments = commandLineArgumentParser.parse_args()

fname = commandLineArguments.fname
lname = commandLineArguments.lname

print "%s\n%s" %(fname,lname)

os.system("python test1.py")

test1.py的代码如下

import argparse
import os

print "test abc"

我希望您能把 lnamefname 的值传递给 test1.py。有没有办法实现这个功能呢?
如果我运行以上代码,
python t.py -fname ms lname = dhoni

那么输出就是

ms
dhoni
test abc

但我希望输出结果如下所示:
ms
dhoni
ms
dhoni 

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - hpaulj
当我打印commandLineArguments的值时,输出结果为Namespace(fname='ms', lname='dhoni')。有没有办法将其更改为--lname=ms -fname=dhoni-lname=ms -fname=dhoni - Arijit Panda
@hpaulj - 感谢您宝贵的回复。我想获取用户提供的所有参数参数。例如,如果用户尝试 python t.py -fname = ms,那么我只想获取 -fname=ms 部分。这样我就可以轻松地将参数传递给 test1.py,方式相同... - Arijit Panda
t.py需要解析参数,还是只需将它们不变地传递给test1.py?有时一个模块会解析一些参数,并将其余部分(它无法处理的)传递给另一个模块。 - hpaulj
我需要以不变的状态传递它们。最终,通过讨论,我得到了这个想法。感谢交流,Stack Overflow 真是太棒了。 - Arijit Panda
显示剩余4条评论
4个回答

0

嗯,我不明白你为什么要这样做,但你已经拥有完成此任务所需的一切:

首先是 Python 脚本(我称之为 sof.py):

import argparse
import subprocess
import os

commandLineArgumentParser = argparse.ArgumentParser()
commandLineArgumentParser.add_argument("-fname", "--fname",  help="first name")
commandLineArgumentParser.add_argument("-lname","--lname", help="last name")
commandLineArguments = commandLineArgumentParser.parse_args()

fname = commandLineArguments.fname
lname = commandLineArguments.lname

print("%s\n%s" %(fname,lname))
command = "python sof2.py {arg1} {arg2}".format(arg1=fname, arg2=lname)
os.system(command)

第二个Python脚本(在这里是sof2.py)

import argparse
import subprocess
import os

commandLineArgumentParser = argparse.ArgumentParser()
commandLineArgumentParser.add_argument("fname")
commandLineArgumentParser.add_argument("lname")
commandLineArguments = commandLineArgumentParser.parse_args()

fname = commandLineArguments.fname
lname = commandLineArguments.lname

print "%s\n%s" %(fname,lname)

这给我以下执行结果:

python3 sof.py -fname foo -lname bar
foo
bar
foo
bar

注意:我使用的是Python3,但如果您必须使用Python2,则此代码仍然正确,只需在print周围删除()即可。


非常感谢您的回复。如果我稍微更改一下命令行,那么输出会是什么样子呢?更改意味着如果我尝试 python sof.py -lname bar -fname foo - Arijit Panda
无法工作。我在第二个脚本中将fnamelname定义为位置参数。如果argparse参数以“-”字符开头,则它将成为可选参数,并且必须按此输入。因此,当调用脚本时,参数“-foo”和“-bar”是可选的,您必须编写script -bar barvalue -foo foovalue,但是如果您定义一个没有“-”开头的参数,则它将成为位置参数。因此,使用foobar时,调用变为:script foovalue barvalue。您不能使用“-”调用fnamelname,您也必须将其添加到argparse参数中。 - Arthur Vaïsse

0

你可以修改test1.py文件,将t.py包含进去,并直接访问argparse变量。

test1.py

import t.py
print t.fname, t.lname

你的回答最有道理,除非那个 os.system("python test1.py") 运行部分是必要的。 - hpaulj

0

将你的test1.py文件改为:

import argparse
import os
import sys

print sys.argv
print "test abc"

并且从t.py中调用你的test1.py

os.system("python test1.py vv gg hh")

现在你的参数 vv gg hh 已经可以在 test1.py 中使用了。


0
尝试这个针对test1.py的代码:
from sys import argv
print "%s\n%s" % (argv[1], argv[2])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接