Python &引用;Can';t从安装目录获取安装脚本的一致路径";

Python &引用;Can';t从安装目录获取安装脚本的一致路径";,python,pip,setup.py,Python,Pip,Setup.py,我正在使用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 set

我正在使用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')

我试着看一下这个项目的,但是没有多大成功。。。有什么想法吗?

这是因为标志
-e
表示“可编辑”,这与执行
python setup.py develope
相同,它创建了一个从
站点包
目录的符号链接,并且没有运行常规安装

查看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

参考资料:


您的包中需要有一个
pyproject.toml
文件。我不知道为什么这会使错误消失,但它是有效的。此文件是的一部分

如果项目中有一个
pyproject.toml
,则可以将包放在
src
子文件夹中:

/src/yourpackage/__init__.py
/setup.py
/pyproject.toml
我不知道为什么会这样,但是当您运行
pip install-e.
以“可编辑”模式安装软件包时,错误消息就会消失。该文件甚至不必包含任何内容,它可以是一个空白文件,错误就会消失


(为了弄清楚这一点,我发现一个正在工作的项目,它的包存储在
src
文件夹下,并一直在删除东西,直到我出现错误。这显然是Pip中的一些错误。我的机器上有Windows 10上针对Python 3.7的18.1版。)

,以备将来使用,如果您在windows 10上使用的是旧版本的setuptools,并且它看起来有一个额外的斜杠,那么您需要更新python包“setuptools”来解决这个问题


您可以通过多种方式进行更新,但有一种是
python-mpip安装--升级setuptools

在我的例子中,问题在于
package_dir={'':'/src'}
:我指定了dir的路径,而不是dir名称,由于某种原因,它在
setup.py bdist\u wheel

上运行良好。我的项目有以下结构:

+-- project/
    +-- src/
    |   +-- project/
    |       +-- __init__.py
    +-- doc/
    +-- tests/
    +-- setup.py
    +-- ...
因此,基本上,
/src/project
中的所有python代码。这就避免了直接从测试脚本或任何东西中导入
项目

setup.py
内容:

setuptools.setup(
...
packages=setuptools.find_packages('src'),
包_dir={'':'src'},
...
)
现在我想把所有这些都拉到下面一个级别,这样整个项目可以有不同的组件,如下所示:

+-- project/
    +-- backend/
    |   +-- src/
    |       +-- project/
    |           +-- __init__.py
    |
    +-- frontend/
    |   +-- ...
    |
    +-- doc/
    +-- tests/
    +-- setup.py
    +-- ...
因此,在尝试
pip安装-e.
时,即使在尝试修复所有路径之后,我也收到了OP中的错误消息

我在
setup.py
中通过以下更新解决了这个问题:

setuptools.setup(
...
packages=setuptools.find_包('backend/src'),
包_dir={'':'backend/src'},
...
)

希望这有帮助

如果我想保留
-e
,这样我就可以指向我的SpiffWorkflow分支并直接对工作副本进行更改,您认为什么是最好的解决方案?您指向的第一个参考使我认为,可以通过将
srcdir
添加到python路径来解决这个问题,并且它可以作为setup.py上的第一个操作之一来完成。不过,这似乎不是一个非常优雅的解决方案……我不认为将
srcdir
添加到python路径会起作用,因为当您执行
import-spiffworkflow
时,python会在pythonpath中查找名为
spiffworkflow
的目录,但存在的是名称
src
。我不知道这个问题的解决方案,我认为这是一种“反模式”,关于将包目录命名为除
设置(name=XXX)
之外的任何其他名称-可能向作者发出请求会更好。如果你找到更好的解决方案,请告诉我。这个问题还没有解决吗?我正在运行setuptools(35.0.2),但仍然出现此错误。移出src后,问题也解决了,当我在src文件夹中保存我的包时,我遇到了这个问题。我使用的解决方法是运行
pipenv shell
来创建一个virtualenv,然后我可以毫无错误地运行
pip install-e.
。我不知道为什么会这样。我发现如果你在文件夹中放一个空白的pyproject.toml文件,这个错误就会消失。我升级了PIP,但忘了升级setuptools。谢谢你的提醒,效果很好。