从 npm 命令激活虚拟环境不起作用



在我的package.json中,我有一个脚本来激活我的python虚拟环境(我的项目使用python和Nodejs)。我想从npm中激活我的虚拟环境。

"scripts": {
    "babel-node": "babel-node --stage 0 --ignore='foo|bar|baz'",
    "test": "export NODE_ENV='test'; ./node_modules/mocha/bin/mocha --compilers js:babel/register server/test/index.js",
    "dev": "./node_modules/nodemon/bin/nodemon.js --exec npm run babel-node -- server/index.js",
    "activate": "source ./venv/bin/activate",
    "import": "python scraper -g -i -db caltrain_test && python ./scraper -g -i",
    "start": "node ./server",
    "docs": "cp README.md docs/index.md && ./node_modules/docco/bin/docco --layout=linear ./docs/index.md"
},

如果我直接从命令行激活我的虚拟环境,它可以工作:

jorgesilvajetter at Jorges-MacBook-Pro-2 in ~/Sites/2015/caltrain-api on master [!?$]
$ source venv/bin/activate
(venv) // This means that it worked!

如果,然而,我从npm运行相同的命令,它不起作用:

jorgesilvajetter at Jorges-MacBook-Pro-2 in ~/Sites/2015/caltrain-api on master [!?$]
$ npm run activate
> caltrain-api@0.0.3 activate /Users/jorgesilvajetter/Sites/2015/caltrain-api
> source ./venv/bin/activate

是否有可能通过npm命令激活我的虚拟环境?似乎我误解了一些关于虚拟环境如何工作或npm如何执行脚本。也许,它在另一个会话/选项卡中运行脚本?

从https://docs.npmjs.com/misc/scripts, "通过将该行作为脚本参数传递给sh来运行脚本。"所以,虽然你使用的是source,但它是在一个新的子shell中。

并且只是一个提醒:npm将./node_modules/.bin添加到npm脚本的PATH,所以在npm脚本中你可以只写"nodemon"而不是".node_modules/nodemon/bin/nodemon.js"".node_modules/.bin/nodemon。npm知道用正确的脚本填充./node_modules/.bin,因为包作者在他们的package.json中指定了"bin"属性。

为了实现您的请求,我做了以下操作:

我正在使用Django,并希望启动后端服务器使用Reactjs

步骤1:

在Django项目的manage.py(即:activate.py)旁边创建一个文件,代码如下

import subprocess
# Path to your python in the env
pythonBinary = "./env/Scripts/python"
# Path to your manage.py file
managePy = "./manage.py"
subprocess.Popen([pythonBinary, managePy, "runserver"])

步骤2:

你的package.json脚本应该是这样的

...
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "activate": "cd /path/to/your/django/project && python activate.py"
  },
...

它对我有用,我希望它对你也有用!

祝你过得愉快

在您的package.json中试试:

{
 "scripts": {
    "predev": "bash -c 'source ./.venv/bin/activate'",
    "dev": "nodemon --exec "python3" src/main.py"
  },
}

我的nodemon.json文件看起来像:

{
  "watch": ["."],
  "ext": ".py",
  "exec": "python3 ./src/main.py"
}

我想它只适用于linux

最新更新