【问题标题】:Run external program with python without shell=True?在没有 shell=True 的情况下使用 python 运行外部程序?
【发布时间】:2019-07-24 10:11:51
【问题描述】:

我正在开发使用 python 和 javascript 的网络游戏。我想编写一个python脚本,使用browserify自动构建我的js文件。为了运行 browserify,我需要在 node_modules/.bin 中使用它的本地安装。我读到命令 npm bin 会给我 npm 二进制文件的位置,所以我想在我的脚本中使用它。

我试过了

import subprocess

c = subprocess.run(("npm", "bin"), capture_output=True)

但这给了我一个错误:

FileNotFoundError: [WinError 2] The system cannot find the file specified

搜索了一下,发现使用shell=True可以解决这个问题:

import subprocess

c = subprocess.run(("npm", "bin"), capture_output=True, shell=True)

但是,在阅读了this question 之后,我意识到使用shell=True 并不是一个好的做法,它可能会导致安全问题。

所以我的问题是,如何使用 python 运行外部命令而不会有shell=True 的风险?

当我尝试通过python运行browserify时,我可能会遇到同样的问题(还没有尝试过),所以我现在应该问这个问题。

提前致谢。

【问题讨论】:

  • 在我看来,错误消息暗示它找不到npm,所以我会尝试在您的通话中使用npm 的完整路径。
  • 但它怎么能便携呢?我不想硬编码npm 的路径,尤其是因为它会在不同平台之间中断。
  • 首先,它有用吗?
  • 是的。刚试了一下。奇怪的是,它只有在我执行 <npm-path>\npm.cmd 时才有效,但在我执行 <npm-path>\npm 时无效(我在 Windows 上)。
  • @ShaiAvr,另外,请注意,Windows 已经足够不同,以至于大多数关于为什么shell=False 更安全的论点......在那里更加模棱两可。在 UNIX 世界(我称之为文明世界)中,调用 execve() 系统调用的程序可以提供被调用的精确参数向量;在 Windows 中,子进程获取一个字符串并负责自己解析它; Windows 上的 main() 采用 argv 和 argc 参数是 libc 具有该解析器的默认实现的结果,但程序不需要使用它。

标签: python shell npm subprocess


【解决方案1】:

据此帖https://stackoverflow.com/a/89243/11576550

你可以使用subprocess.run(["ls", "-l"])

那就试试subprocess.run(["npm", "bin"])

还没试过

【讨论】:

  • 我可以知道 npm 是如何工作的以及它代表什么吗?
  • 它是nodejs的包管理器。它类似于点子。命令npm bin 应该为我提供我在项目中安装的本地二进制文件的路径。
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 2012-04-29
相关资源
最近更新 更多