따라서 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
쉘 함수는 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이라는 사용자를 만들었습니다. 그들은 마음을 바꿨지만 누군가가 제안한 온라인에서 찾은 해결책을 고수할 것입니다.
어쨌든 gksu는 이 명령에 대한 비밀번호를 묻는 메시지를 표시하지만 npm에는 비밀번호가 없으므로 비밀번호를 묻지 않고 이 명령을 실행할 수 있기를 원합니다.
나는 다음을 시도했습니다 :
/etc/sudoers.d/arkos.sudo
npm ALL=(ALL) NOPASSWD: /usr/bin/npm
..하지만 별 효과는 없는 것 같습니다.