在Python Shell中执行带有参数的文件


67

我想在Python Shell中运行命令以执行带有参数的文件。

例如:execfile("abc.py")但是如何添加2个参数?


您要执行的文件中的代码如何检索参数?
martineau 2011年

Answers:


48

execfile运行Python文件,但通过加载而不是脚本来运行。您只能传递变量绑定,不能传递参数。

如果要从Python内部运行程序,请使用subprocess.call。例如

import subprocess
subprocess.call(['./abc.py', arg1, arg2])

7
以下格式对我subprocess.call("python abc.py 'arg1'", shell=True)
有用

1
@geotheory当然可以,但是它不那么安全,当您要将带有引号的字符串传递给子流程时,它会变得冗长。
Fred Foo)2014年

2
您能否解释“加载而不是作为脚本”的含义?有什么不同?
marco's

1
@marco:想法是“脚本”将是一个单独的进程,具有自己的命令行。 execfile在当前进程中运行,因此(如果相关)使用当前命令行。从这个意义上说,没有“传递”参数就无法使用它!
戴维斯·鲱鱼

55

尝试这个:

import sys
sys.argv = ['arg1', 'arg2']
execfile('abc.py')

请注意,abc.py完成后,控制权将返回给调用程序。还要注意,如果确实完成,abc.py可以调用quit()


abc.py据我所知,没有任何东西可以传递,我也看不出为什么会传递。
geotheory 2014年

7
当我的'abc.py'必须argparse解析输入参数时,此方法出现错误:参数太少。我python abc.py arg1 arg2在终端中运行(此方法有效,没有错误),然后sys.argv通过打印来打印的内容,发现其中sys.argv包含名称'abc.py'作为列表的第一个元素。事实上,user2757262的下面的代码使用sys.argv = ['abc.py','arg1', 'arg2']是工作的一个!
Kouichi C. Nakamura

5
文档还说:“argv[0]是脚本名称”。
中村幸一C 2015年

@AntiEarth:sys一个过程中只有一个,它将找到您放置的内容。
戴维斯·鲱鱼

@ KouichiC.Nakamura我看到它execfile已从Python3中删除。如何exec与参数一起使用?
波哥大

50

其实,我们不是要这样做吗?

import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')

...然后事实证明,这python指向的是其他(2-vs-3)版本的Python :)
mlvljr

我不得不否决越野车的答案,因为他错过了这种微妙之处。
philologon

即便如此,如果abc.py阅读以下内容,它也会失败from sys import argv
反地球》

26
import sys
import subprocess

subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])

12

您将模块加载到当前的解释器进程中并在外部调用Python脚本感到困惑。

前者可以通过import查找您感兴趣的文件来完成。execfile与导入类似,但是它只是评估文件而不是从文件中创建模块。类似于shell脚本中的“ source”。

后者可以使用子流程模块来完成。您生成了另一个解释器实例,并将想要的任何参数传递给该实例。这类似于使用反引号在Shell脚本中进行炮击。


12

对于更有趣的场景,您还可以查看该runpy模块。从python 2.7开始,它具有该run_path功能。例如:

import runpy
import sys

# argv[0] will be replaced by runpy
# You could also skip this if you get sys.argv populated
# via other means
sys.argv = ['', 'arg1' 'arg2']
runpy.run_path('./abc.py', run_name='__main__')


2

如果您PYTHONINSPECT在python文件中设置要执行

[repl.py]

import os
import sys
from time import time 
os.environ['PYTHONINSPECT'] = 'True'
t=time()
argv=sys.argv[1:len(sys.argv)]

无需使用execfile,您可以像往常一样在shell中直接运行带有参数的文件:

python repl.py one two 3
>>> t
1513989378.880822
>>> argv
['one', 'two', '3']

1
对于某些用户而言,这是不言而喻的,但是您可以通过将这些变量添加到函数内部的全局命名空间中,对函数中定义/使用的变量使用上述方法。
Brian Bartoldson

1

如果要并行运行脚本并为它们提供不同的参数,可以执行以下操作。

import os
os.system("python script.py arg1 arg2 & python script.py arg11 arg22")

请不要推荐os.system-它的合法用例非常少见。
戴维斯·鲱鱼

为什么它是非法的@DavisHerring?此评论对可能想要了解Mehmet解决方案为何不合适的未来读者没有帮助。
Lou

@Lou:这不适合发表评论。我很惊讶在这里找不到要链接的链接,因此我问/回答了自己的
戴维斯·鲱鱼

0

此外subprocess.call,您也可以使用subprocess.Popen。像下面

subprocess.Popen(['./script', arg1, arg2])


0

这有效:

subprocess.call("python abc.py arg1 arg2", shell=True)

0
runfile('abc.py', ['arg1', 'arg2'])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.