如果密码包含“@”字符
,则从私有pypi安装软件包会失败所以,如果我有 登录:someLogin 密码:密码@
然后我的pip.conf看起来像:
[global]
extra-index-url = https://someLogin:Password@@nexus.privatepypy.com/repository/pypi/xxx
这实际上不起作用。我必须一直输入密码。
这有什么解决方法吗?
PS:更改密码不是解决方案: - )
答案 0 :(得分:1)
也许你需要百分之百,因为它是一个URL。
>>> from urllib.parse import quote_plus
>>> quote_plus('Password@')
'Password%40'
例如在Mongo中,要连接,您可以使用:
>>> from pymongo import MongoClient
>>> import urllib.parse
>>> username = urllib.parse.quote_plus('user')
>>> username
'user'
>>> password = urllib.parse.quote_plus('pass/word')
>>> password
'pass%2Fword'
>>> MongoClient('mongodb://%s:%s@127.0.0.1' % (username, password))
---编辑---
我按照pip中的代码来到这里:
手动运行代码,同时引用和取消引用密码:
未加引号:
>>> from urllib import parse as urllib_parse
>>> url = 'https://someLogin:Password@@nexus.privatepypy.com/repository/pypi/xxx'
>>> parsed = urllib_parse.urlparse(url)
>>> parsed
ParseResult(scheme='https', netloc='someLogin:Password@@nexus.privatepypy.com', path='/repository/pypi/xxx', params='', query='', fragment='')
>>> netloc = parsed.netloc.rsplit("@", 1)[-1]
>>> netloc
'nexus.privatepypy.com'
>>> url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:])
>>> url
'https://nexus.privatepypy.com/repository/pypi/xxx'
>>> def parse_credentials(netloc):
... if "@" in netloc:
... userinfo = netloc.rsplit("@", 1)[0]
... if ":" in userinfo:
... user, pwd = userinfo.split(":", 1)
... return (urllib_parse.unquote(user), urllib_parse.unquote(pwd))
... return urllib_parse.unquote(userinfo), None
... return None, None
>>> username, password = parse_credentials(parsed.netloc)
>>> username, password
('someLogin', 'Password@')
引用:
>>> url = 'https://{}:{}@nexus.privatepypy.com/repository/pypi/xxx'.format(
... urllib_parse.quote_plus('someLogin'),
... urllib_parse.quote_plus('Password@'),
... )
>>> url
'https://someLogin:Password%40@nexus.privatepypy.com/repository/pypi/xxx'
>>> parsed = urllib_parse.urlparse(url)
>>> parsed
ParseResult(scheme='https', netloc='someLogin:Password%40@nexus.privatepypy.com', path='/repository/pypi/xxx', params='', query='', fragment='')
>>> username, password = parse_credentials(parsed.netloc)
>>> username, password
('someLogin', 'Password@')
正如您所看到的,应在两种情况下都能正常工作。由于我可以确认pip取消引用用户名和密码,因此最好引用它们。
如果它仍然无法正常工作,我会检查点数版本或提交错误。