Python 包管理器和 Node.js

Python package managers and Node.js

我正在尝试使用 Node.js 编译 python 脚本。 python 脚本包括我安装的一些模块。 我的 python 包管理器是 Anaconda,所以我尝试在 :

中提供 {"shell":"path to anaconda prompt"} 选项
var exec = require('child_process').exec;
exec('python hello.py',{"shell":"path to anaconda prompt"}, ..callback)

但是,我得到一个错误:

{ Error: spawn C:\Users\dream\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit)\Anaconda Prompt (Anaconda3) ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:232:19)
    at onErrorNT (internal/child_process.js:407:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
    at Function.Module.runMain (internal/modules/cjs/loader.js:744:11)
    at startup (internal/bootstrap/node.js:285:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall:
   'spawn C:\Users\dream\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit)\Anaconda Prompt (Anaconda3)',
  path:
   'C:\Users\dream\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit)\Anaconda Prompt (Anaconda3)',
  spawnargs: [ '/d', '/s', '/c', '"python hello.py"' ],
  cmd: 'python hello.py' }
stdout:

stderr:

我怀疑这是因为 Anaconda Prompt 只是一些奇怪的快捷方式,它为 cmd.exe(快捷方式指向的位置)设置了一些变量。

所以我的问题:

我可以直接用Node.js调用anaconda提示符吗? pip 是否也有 shell?

打包器(pip、anaconda)如何使 python 可以访问模块? -> 这是通过一些环境变量吗?

我可以像他们一样准备 cmd.exe 与 python 一起工作吗?

我认为你不想调用 Anaconda 提示符。

只需调用 python: python print('hello').

如果您调用:Anaconda Prompt (Anaconda3) print('hello')?

,命令行会发生什么

(这应该是评论,但我不能评论。)

I suspect that this is because the Anaconda Prompt is just some weird shortcut that sets up some variables for cmd.exe

是的,差不多就是这些了。所以,不,我不认为你可以按照提议来称呼它。可能有一种方法可以手动操作 cmd.exe 以像 Anaconda Prompt 会话一样 运行ning,但我建议尝试...

conda 运行

不确定这是否适用于 Windows,但可以使用 conda run 在 Conda 环境中执行。这是作为 Conda v4.6 中的一项实验性功能引入(并且仍然存在),其明确目的是在 Conda 环境中启用一个 运行 某些东西而无需交互激活它。

先决条件

首先,您可能应该测试 conda run 是否适用于 Windows。假设您的 conda.exe 位于

C:\Users\dream\Anaconda3\Scripts\conda.exe

开始一个干净的 cmd.exe 会话,其中 conda 未定义(即,不是 Anaconda Prompt)。然后尝试

C:\Users\dream\Anaconda3\Scripts\conda.exe run where python

或者,如果你有另一个环境,说 my_env 你也可以

C:\Users\dream\Anaconda3\Scripts\conda.exe run -n my_env where python

验证获取 运行 的 Python 解释器是否是指定的解释器。

(可能)解决方案

如果上面的方法有效,那么你应该可以做类似的事情

var exec = require('child_process').exec;
exec('C:\Users\dream\Anaconda3\Scripts\conda.exe run python hello.py', ..callback)

不确定您是否需要在这种情况下指定的 shell。