当名称中有连字符时获取包版本
Getting a package version when the name has a hyphen in it
我使用 PyScaffold 为我正在创建的 PyPi 包创建了一个模板,bbox-utils
。生成的__init__.py
如下:
from pkg_resources import DistributionNotFound, get_distribution
try:
# Change here if project is renamed and does not equal the package name
dist_name = "bbox-utils"
__version__ = get_distribution(dist_name).version
except DistributionNotFound: # pragma: no cover
__version__ = "unknown"
finally:
del get_distribution, DistributionNotFound
我对 dist_name
使用什么名称有点困惑。我尝试这样做:
>>> from pkg_resources import DistributionNotFound, get_distribution
>>> get_distribution('bbox_utils').version
'0.0.1'
>>> get_distribution('bbox-utils').version
'0.0.1'
无论我用下划线替换连字符还是保持原样,我都得到相同的版本。我该怎么做?
尽管可以,但通常不应使用破折号命名包或模块。由于导入语句不使用引号,所以使用破折号会被解释为使用减号,如果使用破折号名称将导致导入时出现语法错误。
有很多方法可以解决这个问题,例如使用下划线导入但通过 pip/searching pypi 使用破折号安装,但这是一种不必要的不一致,可能会导致挫败感。通常 python 方法是能够将模块作为有效模块对象导入,其变量名称等于实际模块名称。因此,在命名项目时,最好使用下划线而不是破折号。
也就是说,pkg_resources 在解析项目名称时似乎实际上用短划线替换了所有非字母数字和非点字符。
assert(get_distribution('bbox_utils').project_name == 'bbox-utils')
assert(get_distribution('bbox-utils').project_name == 'bbox-utils')
因此,您应该能够在问题的代码片段中交替使用任一表达式。
我使用 PyScaffold 为我正在创建的 PyPi 包创建了一个模板,bbox-utils
。生成的__init__.py
如下:
from pkg_resources import DistributionNotFound, get_distribution
try:
# Change here if project is renamed and does not equal the package name
dist_name = "bbox-utils"
__version__ = get_distribution(dist_name).version
except DistributionNotFound: # pragma: no cover
__version__ = "unknown"
finally:
del get_distribution, DistributionNotFound
我对 dist_name
使用什么名称有点困惑。我尝试这样做:
>>> from pkg_resources import DistributionNotFound, get_distribution
>>> get_distribution('bbox_utils').version
'0.0.1'
>>> get_distribution('bbox-utils').version
'0.0.1'
无论我用下划线替换连字符还是保持原样,我都得到相同的版本。我该怎么做?
尽管可以,但通常不应使用破折号命名包或模块。由于导入语句不使用引号,所以使用破折号会被解释为使用减号,如果使用破折号名称将导致导入时出现语法错误。
有很多方法可以解决这个问题,例如使用下划线导入但通过 pip/searching pypi 使用破折号安装,但这是一种不必要的不一致,可能会导致挫败感。通常 python 方法是能够将模块作为有效模块对象导入,其变量名称等于实际模块名称。因此,在命名项目时,最好使用下划线而不是破折号。
也就是说,pkg_resources 在解析项目名称时似乎实际上用短划线替换了所有非字母数字和非点字符。
assert(get_distribution('bbox_utils').project_name == 'bbox-utils')
assert(get_distribution('bbox-utils').project_name == 'bbox-utils')
因此,您应该能够在问题的代码片段中交替使用任一表达式。