所以我有以下代码应该检查是否安装了 npm 包:
def is_installed(name, as_global=True):
# Returns whether NPM package is installed.
s = shell(_get_npm_command("ls -p --depth 0", as_global))
match = re.search(r'\b%s\b' % (name), s['stdout'])
if match:
return True
return False
shell 函数是 subprocess.Popen() 包装器:
def shell(c, stdin=None, env={}):
# Simplified wrapper for shell calls to subprocess.Popen()
environ = os.environ
environ["LC_ALL"] = "C"
for x in env:
environ[x] = env[x]
if not "HOME" in environ:
environ["HOME"] = "/root"
p = subprocess.Popen(shlex.split(c),
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
env=environ)
data = p.communicate(stdin)
return {"code": p.returncode, "stdout": data[0],
"stderr": data[1]}
并使用像这样的 get_npm_command :
def _get_npm_command(command, as_global, path=None):
# returns npm command
if as_global:
return _get_global_npm_command(command)
else:
return _get_local_npm_command(command, path)
def _get_global_npm_command(command):
# returns global npm command
os.chdir(NPM_PATH)
return "gksu -u npm 'npm " + command + " -g'"
def _get_local_npm_command(command, install_path):
# returns local npm command
if install_path:
os.chdir(install_path)
return "npm " + command + " "
正如你所看到的,最终的命令是:
gksu -u npm npm ls -p --depth 0
换句话说,我创建了一个名为 npm 的用户来安装全局 npm 软件包,因为不久前 npm 建议不要使用 root 权限才能使用它。他们改变了主意,但我打算坚持使用我在网上找到的有人提出的解决方案。
无论如何,gksu 会提示我输入此命令的密码,但 npm 并不意味着有密码,因此我希望能够在不要求输入密码的情况下运行此命令。
我尝试过以下方法:
/etc/sudoers.d/arkos.sudo
npm ALL=(ALL) NOPASSWD: /usr/bin/npm
..但这似乎没有任何效果。