当前位置: 首页 > 面试题库 >

从Python调用外部命令

王旺
2023-03-14
问题内容

你如何从Python脚本中调用外部命令(就像我在Unix Shell或Windows命令提示符下键入的一样)?


问题答案:

下面总结了调用外部程序的方法以及每种方法的优缺点:

  1. os.system("some_command with args")将命令和参数传递到系统的外壳程序。很好,因为您实际上可以以这种方式一次运行多个命令,并设置管道和输入/输出重定向。例如:
os.system("some_command < input_file | another_command > output_file")  

但是,尽管这很方便,但是您必须手动处理外壳字符(例如空格等)的转义。另一方面,这也使您可以运行仅是外壳命令而不是外部程序的命令。请参阅文档。

  1. stream = os.popen("some_command with args")os.system除了会为您提供类似于文件的对象之外,您可以使用该对象来访问该过程的标准输入/输出,它的作用与之相同。Popen还有其他3种变体,它们对I / O的处理略有不同。如果您将所有内容都作为字符串传递,那么您的命令将传递到外壳程序;如果将它们作为列表传递,则无需担心转义任何内容。请参阅文档。

  2. 模块的Popensubprocess。它旨在替代它,os.popen但缺点是由于太全面而使它稍微复杂一些。例如,您会说:

print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()

代替:

print os.popen("echo Hello World").read()

但是将所有选项都放在一个统一的类中而不是4个不同的popen函数是一个很好的选择。请参阅文档。

  1. call来自subprocess模块的功能。基本上就像Popen类一样,并接受所有相同的参数,但是它只是等到命令完成并提供返回代码。例如:
return_code = subprocess.call("echo Hello World", shell=True) 

请参阅文档。

  1. 如果您使用的是Python 3.5或更高版本,则可以使用新subprocess.run功能,该功能与上面的功能非常相似,但是更加灵活,CompletedProcess当命令执行完毕后会返回一个对象。

  2. os模块还具有您在C程序中拥有的所有fork / exec / spawn函数,但是我不建议直接使用它们。

subprocess模块可能是您所使用的模块。

最后,请注意,对于所有方法,在这些方法中,您将要由外壳执行的最终命令作为字符串传递给您,并且您有责任对其进行转义。如果您传递的字符串的任何部分不能被完全信任,则将带来严重的安全隐患。例如,如果用户正在输入字符串的某些/任何部分。如果不确定,请仅将这些方法与常量一起使用。为了给您暗示的含义,请考虑以下代码:

print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()

并想象用户输入了“我的妈妈不爱我&& rm -rf /”这可能会擦除整个文件系统的信息。



 类似资料:
  • rank ▲ ✰ vote url 6 1161 520 1167 url 在Python中调用外部命令? 怎么在Python脚本里调用外部命令?(就好像直接输入在Unix shell中或者windows的命令行里) 来来来,我给你叨咕叨咕各种方法和各自优缺点: os.system("命令加参数")把命令和参数传递给你系统的shell中.用这个命令的好处在于你可以一次运行好多命令还可以设置管道来进

  • 如何从Swift脚本调用外部命令(启动子流程)? 也许类似于Python中的。

  • 问题内容: 我是Jenkins的新手,我不确定是否可以这样做,但是我想设置一个Web界面,在此人可以单击“开始作业”,这将告诉Jenkins开始特定的构建作业。 詹金斯(Jenkins)是否有允许这种事情的网络服务?如果是这样,那将是一个简单的例子? 问题答案: 这是文档的链接: Jenkins远程访问API 。 查看“ 提交作业” 部分。 在您的工作配置中,您设置了令牌,然后向发送请求。那可能是

  • Vim遵循UNIX哲学"做一件事,做好它"。 与其试图集成你可能想要的功能到编辑器自身,更好的办法是在适当时使用Vim来调用外部命令。 让我们在插件中添加一些跟Potion编译器交互的命令,来浅尝在Vim里面调用外部命令的方法。 编译 首先我们将加入一个命令来编译和执行当前Potion文件。 有很多方法可以实现这一点,不过我们暂且用外部命令简单地实现。 在你的插件的repo中创建potion/ft

  • 我想从静态编程语言代码调用外部命令。 在C/Perl中,我将使用函数 在Python中,我将使用子流程模块 在Go中,我将使用os/exec等 但是在科特林我该怎么做呢?

  • 问题内容: 我想从React元素的实例中调用React组件公开的方法。 例如,在此jsfiddle中。我想从参考中调用该方法。 有没有一种方法可以实现而无需编写其他包装程序? 编辑 (从JSFiddle复制的代码) 问题答案: 有两种访问内部函数的方法。一个实例级别,如您所愿,另一个静态级别。 实例 您需要在从返回时调用函数。见下文。 静态的 看一下ReactJS Statics。但是请注意,静态