代码之家  ›  专栏  ›  技术社区  ›  Tamás Szelei

如何评估PEP-508型平台标记?

  •  2
  • Tamás Szelei  · 技术社区  · 6 年前

    我想以编程方式评估PEP-508样式的平台标记,例如 platform_system == 'Windows' . 实现一个解析器并不是很困难,但是我假设PIP中有一个解析器。它叫什么?如何在自己的脚本中导入和使用它?

    1 回复  |  直到 6 年前
        1
  •  2
  •   hoefling    6 年前

    pkg_resources

    PKGL资源 (部分) setuptools 包)提供标记评估功能。

    In [1]: from pkg_resources import evaluate_marker
    
    In [2]: evaluate_marker('sys_platform == "darwin"')
    Out[2]: True
    
    In [3]: evaluate_marker('python_version > "3.7"')
    Out[3]: False
    
    In [4]: evaluate_marker('implementation_name == "cpython"')
    Out[4]: True
    
    In [5]: evaluate_marker('garbage')
    Traceback (most recent call last):
    
      File "/Users/hoefling/Library/Python/3.7/lib/python/site-packages/IPython/core/interactiveshell.py", line 2961, in run_code
        exec(code_obj, self.user_global_ns, self.user_ns)
    
      File "<ipython-input-2-69434540d2ec>", line 1, in <module>
        evaluate_marker('garbage')
    
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pkg_resources/__init__.py", line 1372, in evaluate_marker
        raise SyntaxError(e)
    
      File "<string>", line unknown
    SyntaxError: Invalid marker: 'garbage', parse error at 'garbage'
    

    等。

    packaging

    在引擎盖下, pkg_resources.evaluate_marker 使用 packaging.markers.Marker.evaluate packaging 打包,因此您可以使用它:

    In [6]: from packaging.markers import Marker
    
    In [7]: Marker('"linux" in sys_platform').evaluate()
    Out[7]: False