Как установить пакет npm из скрипта python?

Как установить пакет npm из скрипта python?

Когда я использую subprocess.Popen(["node", "app.js"]) это нормально.
Когда я использую subprocess.Popen(["npm", "install", "open"]) это выбрасывает ошибку.

Извините, но Google и DuckDuckGo не мои друзья сегодня (

Основная проблема - автоматическая локальная установка необходимых пакетов для моей маленькой утилиты, потому что глобальные пакеты не работают в windows.

PS. Я должен задать этот вопрос, потому что я пытаюсь разработать плагин для Sublime Text 2.

Это ошибка в Sublime python console:

Reloading plugin …\stsync.py
Traceback (most recent call last):
  File ".\sublime_plugin.py", line 103, in create_application_commands
    cmds.append(class_())
  File ".\stsync.py", line 16, in __init__
  File ".\subprocess.py", line 633, in __init__
  File ".\subprocess.py", line 842, in _execute_child
WindowsError: [Error 2] 

строка 16: subprocess.Popen(["node", "npm", "install", "open"])


Если я изменю 16-ю строку на subprocess.Popen(["node", "npm", "install", "open"]), тогда скрипт python успешно вызовет терминал nodejs, но тогда терминал nodejs завершится с ошибкой:
cannot find npm module
ошибка nodejs

2 ответа

Установить shell аргумент в пользу истины

subprocess.Popen(["node", "npm", "install", "open"], shell=True)

В Windows многие из двоичных файлов Node.js на самом деле имеют суффикс .cmd расширение файла, которое по какой-либо причине во время вызова через subprocess.Popenне расширяется (хотя PATHEXT может содержать .cmd).

Так что для правильного решения (которое не использует shell=True), попробуйте добавить .cmd для бинарных файлов Node.js необходимо:

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.Popen(['npm.cmd', 'install'])
<subprocess.Popen object at 0x005E18B0>
>>> npm ERR! install Couldn't read dependencies

Конечно ошибка, потому что у меня нет package.json в этом каталоге. Попробуйте еще раз, используя некоторые другие часто используемые программы, такие как webpack:

>>> subprocess.Popen(['webpack'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
...
FileNotFoundError: [WinError 2] The system cannot find the file specified

Ах да, добавь это .cmd:

>>> subprocess.Popen(['webpack.cmd'])
<subprocess.Popen object at 0x008A18B0>
>>> No configuration file found and no output filename configured via CLI option
Другие вопросы по тегам