【问题标题】:How to tell Pipenv ignore a package in Pipfile based on the OS如何告诉 Pipenv 基于操作系统忽略 Pipfile 中的包
【发布时间】:2019-12-10 12:02:27
【问题描述】:

我正在使用 Pipenv 创建一个 Python 项目,并且我有以下 Pipfile:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
black = "==19.10b0"
pylint = "==2.4.4"
pytest = "==5.3.1"
pytest-mock = "==1.13.0"
pytest-flask = "==0.15.0"

[packages]
python-decouple = "==3.3"
pytz = "*"
Flask = "==1.1.1"
Flask-RESTful = "==0.3.7"
uWSGI = "==2.0.18"

[requires]
python_version = "3.8"

我的问题是uWSGI 软件包仅适用于 Linux,而我使用的是 Windows。因此,每当我运行pipenv install 时,它都会因此而失败。有没有办法告诉 Pipenv 只在 Windows 环境下忽略这个包的安装?

更新

这是命令的结果:pipenv lock -r

Pipfile.lock (e1b4e4) out of date, updating to (5696f6)…
Locking [dev-packages] dependencies…
Success!
Locking [packages] dependencies…
Locking Failed!
Traceback (most recent call last):
  File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 126, in <module>
    main()
  File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 118, in main
    _main(parsed.pre, parsed.clear, parsed.verbose, parsed.system,
  File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 78, in _main
    results = resolve(
  File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 61, in resolve
    return resolve_deps(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\utils.py", line 718, in resolve_deps
    resolved_tree, hashes, markers_lookup, resolver = actually_resolve_deps(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\utils.py", line 480, in actually_resolve_deps
    resolved_tree = resolver.resolve()
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\utils.py", line 385, in resolve
    results = self.resolver.resolve(max_rounds=environments.PIPENV_MAX_ROUNDS)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\resolver.py", line 102, in resolve
    has_changed, best_matches = self._resolve_one_round()
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\resolver.py", line 206, in _resolve_one_round
    for dep in self._iter_dependencies(best_match):
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\resolver.py", line 301, in _iter_dependencies
    dependencies = self.repository.get_dependencies(ireq)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\repositories\pypi.py", line 234, in get_dependencies
    legacy_results = self.get_legacy_dependencies(ireq)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\repositories\pypi.py", line 426, in get_legacy_dependencies
    results, ireq = self.resolve_reqs(download_dir, ireq, wheel_cache)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\repositories\pypi.py", line 297, in resolve_reqs
    results = resolver._resolve_one(reqset, ireq)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\resolve.py", line 260, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\resolve.py", line 211, in _get_abstract_dist_for
    abstract_dist = self.preparer.prepare_linked_requirement(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\operations\prepare.py", line 294, in prepare_linked_requirement
    abstract_dist.prep_for_dist(finder, self.build_isolation)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\operations\prepare.py", line 127, in prep_for_dist
    self.req.run_egg_info()
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\req\req_install.py", line 470, in run_egg_info
    call_subprocess(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\utils\misc.py", line 703, in call_subprocess
    raise InstallationError(
pipenv.patched.notpip._internal.exceptions.InstallationError: Command "python setup.py egg_info" failed with error code 1 in C:\Users\FELIPE~1\AppData\Local\Temp\tmpuyfdyzgwbuild\uwsgi\
File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 126, in <module>
    main()
  File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 118, in main
    _main(parsed.pre, parsed.clear, parsed.verbose, parsed.system,
  File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 78, in _main
    results = resolve(
  File "c:/users/felipe a/appdata/local/programs/python/python38-32/lib/site-packages/pipenv/resolver.py", line 61, in resolve
    return resolve_deps(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\utils.py", line 718, in resolve_deps
    resolved_tree, hashes, markers_lookup, resolver = actually_resolve_deps(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\utils.py", line 480, in actually_resolve_deps
    resolved_tree = resolver.resolve()
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\utils.py", line 385, in resolve
    results = self.resolver.resolve(max_rounds=environments.PIPENV_MAX_ROUNDS)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\resolver.py", line 102, in resolve
    has_changed, best_matches = self._resolve_one_round()
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\resolver.py", line 206, in _resolve_one_round
    for dep in self._iter_dependencies(best_match):
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\resolver.py", line 301, in _iter_dependencies
    dependencies = self.repository.get_dependencies(ireq)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\repositories\pypi.py", line 234, in get_dependencies
    legacy_results = self.get_legacy_dependencies(ireq)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\repositories\pypi.py", line 426, in get_legacy_dependencies
    results, ireq = self.resolve_reqs(download_dir, ireq, wheel_cache)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\piptools\repositories\pypi.py", line 297, in resolve_reqs
    results = resolver._resolve_one(reqset, ireq)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\resolve.py", line 260, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\resolve.py", line 211, in _get_abstract_dist_for
    abstract_dist = self.preparer.prepare_linked_requirement(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\operations\prepare.py", line 294, in prepare_linked_requirement
    abstract_dist.prep_for_dist(finder, self.build_isolation)
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\operations\prepare.py", line 127, in prep_for_dist
    self.req.run_egg_info()
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\req\req_install.py", line 470, in run_egg_info
    call_subprocess(
  File "c:\users\felipe a\appdata\local\programs\python\python38-32\lib\site-packages\pipenv\patched\notpip\_internal\utils\misc.py", line 703, in call_subprocess
    raise InstallationError(
pipenv.patched.notpip._internal.exceptions.InstallationError: Command "python setup.py egg_info" failed with error code 1 in C:\Users\FELIPE~1\AppData\Local\Temp\tmpuyfdyzgwbuild\uwsgi\

【问题讨论】:

    标签: python pipenv


    【解决方案1】:

    bjoern 也有同样的问题,它不支持 Windows。

    我的工作语法是:

    bjoern = {version = "*", markers="sys_platform == 'linux'"}

    它显示了一个警告。

    【讨论】:

      【解决方案2】:

      除了版本,还可以在 Pipenv 文件中传递环境/os。

      对于您的示例(仅在 linux 上具有 uWSGI):

      uWSGI = {version = "*", sys_platform = "== 'linux'"}

      您可以通过以下方式查看sys_platform

      import sys
      print(sys.platform) #python3
      

      如果您有 sys 平台(例如 win32linux),您可以如上所述在 Pipenv 文件中添加 sys_platform

      这应该可以解决您的问题

      编辑

      uWSGI 目前存在与 Windows 集成的问题:

      Pipenv 需要运行 setup.py 来检查来自源的依赖项 分配。你需要让 uWSGI 释放一个轮子,或者在 至少让 setup.py egg_info 在 Windows 上工作(库本身可以 不需要工作,只需 setup.py)。 来自github.com/pypa/pipenv/issues/3084

      使用此代码,您可以制定一个解决方法,我尝试了它并且它有效:

      # make pipenv lock uwsgi works under windows
      # add func to os.py in virtualenv
      
      def uname():
          import inspect
          caller = inspect.getmodule(inspect.stack()[1][0]).__name__
          if caller == 'uwsgiconfig':
              return ("", "", "", "", "")
          raise AttributeError()
      

      *代码来自gist.github.com/hulucc/669b3f9cc379f017840285fb2bed3387 *

      【讨论】:

      • 嗨,我将我的 Pipfile 更改为:uWSGI = {version = "==2.0.18", sys_platform = "== 'linux'"},但我仍然收到错误。
      • 你能给我pipenv lock -r(文件)的输出吗
      • 我已经用您要求的输出更新了问题
      • 啊,是的,我看到了问题,Pipenv needs to run setup.py to inspect dependencies from a source distribution. You will need to ask uWSGI to release a wheel, or at least make setup.py egg_info work on Windows (the library itself does not need to work, only setup.py). 使用此代码,您可以制定解决方法用于 pipenv uwgsi windows 兼容性的 PR。
      • 似乎有更多关于它的开放错误,但它的 uwsgi 与 pipenv 无关。 github.com/mirumee/saleor/issues/3355
      猜你喜欢
      • 2019-01-23
      • 1970-01-01
      • 2014-02-14
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多