python “无法从安装目录获取安装脚本的一致路径”

nkcskrwz  于 2023-01-08  发布在  Python
关注(0)|答案(6)|浏览(143)

我正在使用pip从git仓库安装一个软件包:

pip install -e git+git://github.com/knipknap/SpiffWorkflow.git@master#egg=SpiffWorkflow-dev

repo可以正常克隆,但安装失败并显示以下消息:

Running setup.py egg_info for package SpiffWorkflow
Installing collected packages: SpiffWorkflow
Running setup.py develop for SpiffWorkflow
 error: ("Can't get a consistent path to setup script from installation 
  directory", '/', '/home/fcorreia/venvs/myproj/src/spiffworkflow')

我试着看一下项目的setup.py,但是没有太大的成功......有什么想法吗?

3bygqnnd

3bygqnnd1#

对于未来的人们来说,如果你在windows10上使用的是一个旧版本的setuptools,并且它看起来有一个额外的斜线,你需要更新python包“setuptools”来绕过这个windows 10 python bug
您可以通过多种方式进行更新,但python -m pip install --upgrade setuptools是其中之一

pieyvz9o

pieyvz9o2#

你需要在你的软件包里有一个pyproject.toml文件。我不知道为什么这个错误会消失,但是它起作用了。这个文件是PEP 518 "Specifying Minimum Build System Requirements for Python Projects"的一部分。
如果项目中有pyproject.toml,则可以将包放在src子文件夹中:

/src/yourpackage/__init__.py
/setup.py
/pyproject.toml

我不知道为什么这样做,但是当你在“editable”模式下运行pip install -e .来安装这个包时,这个错误信息就消失了。这个文件甚至不需要有任何东西,它可以是一个空文件错误就消失了。
(To我发现一个正在工作的项目,它的包存储在src文件夹下,并且一直在删除一些东西,直到我收到那个错误。这显然是Pip中的一些bug。我的机器上有Windows 10 for Python 3.7的18.1版本。)

a9wyjsp7

a9wyjsp73#

这是因为标记-e意味着“可编辑”,并且它与python setup.py develop相同,这会创建一个从<PACKAGE_NAME_LOWERCASE>site-packages目录的符号链接,而不运行常规安装。
查看SpiffWorkflow的setup.py,我可以看到问题所在:

srcdir = join(dirname(__file__), 'src')
setup(...,
      package_dir      = {'': srcdir})

它指出包内容位于src,而不是spiffworkflow(开发模式所期望的)。
您可以丢弃-e标志并高兴地执行以下操作:

pip install git+git://github.com/knipknap/SpiffWorkflow.git@master#egg=SpiffWorkflow-dev

参考文献:

gajydyqb

gajydyqb4#

在我的例子中,问题是与package_dir = {'': './src'}:我指定了dir的 path,而不是dir name,出于某种原因,这在setup.py bdist_wheel中运行良好。

qjp7pelc

qjp7pelc5#

我的项目结构如下:

+-- project/
    +-- src/
    |   +-- project/
    |       +-- __init__.py
    +-- doc/
    +-- tests/
    +-- setup.py
    +-- ...

所以基本上,所有的python代码都是/src/project的,这样可以避免直接从测试脚本或其他地方导入project
setup.py含量:

setuptools.setup(
    ...
    packages=setuptools.find_packages('src'),
    package_dir={'': 'src'},
    ...
)

现在我想把所有这些都拉到下面一层,这样整个项目就可以有不同的组件,如下所示:

+-- project/
    +-- backend/
    |   +-- src/
    |       +-- project/
    |           +-- __init__.py
    |
    +-- frontend/
    |   +-- ...
    |
    +-- doc/
    +-- tests/
    +-- setup.py
    +-- ...

所以当我尝试pip install -e .时,即使在尝试修复所有路径后,我也会收到OP中的错误消息。
我通过以下setup.py中的更新解决了这个问题:

setuptools.setup(
    ...
    packages=setuptools.find_packages('backend/src'),
    package_dir={'': 'backend/src'},
    ...
)

希望这有帮助!

biswetbf

biswetbf6#

在我的例子https://github.com/pypa/setuptools/discussions/3755中,我从包目录配置的开头删除了./ chars,并且成功地安装了它。

相关问题