在Python shell中执行带参数的文件

oli*_*dev 63 python shell

我想在Python Shell中运行一个命令来执行带参数的文件.

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

小智 53

试试这个:

import sys
sys.argv = ['arg1', 'arg2']
execfile('abc.py')
Run Code Online (Sandbox Code Playgroud)

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

  • 当我的'abc.py'有'argparse`来解析输入参数时,我得到了一个错误:这个方法太少了.我在终端运行了`python abc.py arg1 arg2`(这个方法没有错误)然后通过打印打印出`sys.argv`的内容,发现`sys.argv`包含名称''abc.py' `作为列表的第一个元素.实际上,**user2757262的代码**以及`sys.argv = ['abc.py','arg1','arg2']`是有效的! (7认同)
  • [文档](https://docs.python.org/2.7/library/sys.html#sys.argv)也说,"`argv [0]`是脚本名称". (5认同)

小智 48

实际上,我们不想这样做吗?

import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')
Run Code Online (Sandbox Code Playgroud)

  • 很棒,这个非常好用!谢谢. (2认同)

Fre*_*Foo 45

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

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

subprocess.call(['./abc.py', arg1, arg2])
Run Code Online (Sandbox Code Playgroud)

  • 以下格式适用于我:`subprocess.call("python abc.py'arg1'",shell = True)` (6认同)
  • @geotheory 当然可以,但它不太安全,而且当您想将带引号的字符串传递给子进程时,它会变得很麻烦。 (2认同)
  • 你能解释一下"加载它而不是脚本"是什么意思吗?有什么不同? (2认同)
  • @marco:这个想法是“脚本”将是一个具有自己的命令行的单独进程。`execfile` 在当前进程中运行,因此(如果相关)使用 *current* 命令行。从这个意义上说,如果没有“传递”参数,您就无法使用它! (2认同)

nos*_*klo 25

import sys
import subprocess

subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])
Run Code Online (Sandbox Code Playgroud)


Nou*_*him 10

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

前者可以通过import您感兴趣的文件来完成.execfile类似于导入,但它只是评估文件而不是创建一个模块.类似于shell脚本中的"sourcing".

后者可以使用子进程模块完成.你产生了解释器的另一个实例,并传递你想要的任何参数.这类似于使用反引号在shell脚本中进行shelling.


pet*_*tre 7

对于更有趣的场景,您还可以查看该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__')
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 5

您无法传递命令行参数execfile().看看subprocess吧.