【发布时间】: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