【问题标题】:Why is my Python setup script failing?为什么我的 Python 设置脚本失败了?
【发布时间】:2013-06-20 20:20:23
【问题描述】:

我正在处理一个更复杂的项目,为了将事情简化为本质以了解失败的原因,我编写了以下项目(屏幕截图来自 Eclipse)

这是运行前的目录结构setup.py sdist 请注意,这里有两个项目 - 我用于测试分发过程的简单项目 (Deploy_Test),以及包含 class函数的 common 项目 我希望跨项目共享的包。右边是我的 setup.py 文件的内容

这是运行 setup.py sdist 的输出。注意最后由红框标出的错误行:

这是结果。注意创建的空文件夹(再次由红色框标出)。在右侧,您可以看到创建的 MANIFEST 文件的内容:

我最初的想法是,尽管我通过 package_dir 参数在 setup.py 中引用了引用的“类”和“函数”包,但这在某种程度上导致了问题。

为了测试这一点,我将“类”和“函数”包复制并粘贴到 Deploy_Test 文件夹中,从 setup.py 中删除 package_dir 参数,删除MANIFEST 文件和空文件夹,然后重新运行 setup.py sdist,得到了类似的结果 - 以前的“common”目录丢失了,但“classes”和“functions”目录现在出现在Deploy_Test-1.0 目录,但仍然是空的,Deploy_Test-1.0 下的 Deploy_Test 子目录也是如此。

我仍然收到相同的错误“功能不正确”错误消息。我仍然不明白它想告诉我什么。

感谢您对此的任何建议...

在获得@Cartroo 对此的建议后,我在本地 HD (NTFS) 上使用相同的结构重新运行了该过程。确实避免了“不正确的功能”错误,但现在有别的东西把事情搞砸了。这是 setup.py sdist

的输出
running sdist
running check
writing manifest file 'MANIFEST'
creating Deployment Test-1.0
creating Common
creating Common\classes
creating Common\functions
creating Deployment Test-1.0\Deploy_Test
making hard links in Deployment Test-1.0...
hard linking setup.py -> Deployment Test-1.0
hard linking ..\Common\classes\__init__.py -> Deployment Test-1.0\..\Common\classes
hard linking ..\Common\classes\fw_ftp.py -> Deployment Test-1.0\..\Common\classes
hard linking ..\Common\functions\__init__.py -> Deployment Test-1.0\..\Common\functions
hard linking ..\Common\functions\fw_date.py -> Deployment Test-1.0\..\Common\functions
hard linking ..\Common\functions\fw_db.py -> Deployment Test-1.0\..\Common\functions
hard linking ..\Common\functions\fw_file.py -> Deployment Test-1.0\..\Common\functions
hard linking ..\Common\functions\fw_file_io.py -> Deployment Test-1.0\..\Common\functions
hard linking ..\Common\functions\fw_string.py -> Deployment Test-1.0\..\Common\functions
hard linking Deploy_Test\Deploy_Test.py -> Deployment Test-1.0\Deploy_Test
hard linking Deploy_Test\__init__.py -> Deployment Test-1.0\Deploy_Test
creating dist
creating 'dist\Deployment Test-1.0.zip' and adding 'Deployment Test-1.0' to it
adding 'Deployment Test-1.0\PKG-INFO'
removing 'Deployment Test-1.0' (and everything under it)
error removing Deployment Test-1.0: Deployment Test-1.0\Deploy_Test\Deploy_Test.py: The system cannot find the file specified
error removing Deployment Test-1.0: Deployment Test-1.0\Deploy_Test\__init__.py: The system cannot find the file specified
error removing Deployment Test-1.0: Deployment Test-1.0\Deploy_Test: The directory is not empty
error removing Deployment Test-1.0: Deployment Test-1.0\setup.py: The system cannot find the file specified
error removing Deployment Test-1.0: Deployment Test-1.0: The directory is not empty

dist/Deployment Test-1.0.zip 中只包含一个文件:PKG-INFO Deployment Test-1.0 目录 中所有声称找不到错误的文件都存在。 Common 项目文件夹都被复制到 /Deploy_Test 文件夹下自己的子文件夹中,并且 MANIFEST 文件似乎是正确的(它包括 setup.py 中指定的包中包含的所有模块)

哈!有趣的!返回到 USB 驱动器并将这两行添加到 @Cartroo 建议的 setup.py 后,我没有收到任何错误 - 甚至没有我在本地 HD 上遇到的关于找不到文件的错误。

我不确定我是否已经完全走出困境,因为 dist 文件夹包含一个 zip 文件,其中只有 Deploy_Test.py 文件。该过程将 Common/ 文件夹复制到 Deploy_Test\ 文件夹,并在清单文件中包含对原始 Common/ 文件夹内容的引用(它存在于 Deploy_Test 文件夹的附属物),但这些模块都没有包含到 dist文件夹,这是我所期待的。但是,考虑到我不知道成功的 Python 发行版是什么样的,我可能做出了不正确的假设

【问题讨论】:

    标签: python python-3.x distutils


    【解决方案1】:

    内存来看,“不正确的功能”错误是一个特定于 Windows 的错误,它非常通用,通常表明您正在执行系统不支持的操作。

    我注意到错误之前的消息是关于硬链接的——我想知道这是否只适用于某些文件系统。我建议检查您是否使用 NTFS - 如果没有,也许看看是否可以创建一个小的 NTFS 分区来尝试构建(可能在 USB 驱动器上)。

    如果它与硬链接有关,那么this bug 可能是相关的。如果是这样,那将给你一个简单的尝试 - 在你的 setup.py 的开头插入这个 right 看看它是否有帮助(甚至在你的第一个 import 之前):

    import os
    del os.link
    

    当然,这是基于前一段时间在 Windows 上出于其他原因调查该错误的预感和一些模糊记忆。但是,至少插入这两行是您可以很容易尝试的。我也不建议这是解决问题的一种强大且可移植的方法,但至少它是否会改变您看到的错误可能会为您提供有关它是否至少相关的信息。

    【讨论】:

    • 谢谢 - 有趣的是我从 USB 驱动器运行它(它允许我在办公室的台式计算机或家里的笔记本电脑上工作)。在您提到尝试从 USB 驱动器运行它之前,我的第一个想法是将结构复制到我的本地 HD(即 NTFS)以查看是否可以避免问题。我会先尝试一下,然后将您建议的两行添加到我的 setup.py 中,如果任一修复解决了问题,请报告。
    • 好吧,这很有道理——如果你还没有重新格式化它,USB 驱动器通常会预先格式化为不支持硬链接的 FAT 或 VFAT。一旦您尝试过 NTFS,如果您可以在此处发布您的发现,我可以更新我的答案,以便对遇到此问题的其他人提供更有用的回复。
    • 是的 - 我昨晚读完这篇文章后检查了一下,USB 驱动器是 FAT32。有关在本地 HD 上尝试此操作的结果,请参阅我对上面原始帖子的编辑。
    • 好的 - 我终于可以正常运行设置了。似乎我只能在本地驱动器上执行此操作。它无法在我们发现的 USB 驱动器 (FAT32) 上完成,但似乎也无法在映射的网络驱动器上完成,这就是我遇到第二次失败的原因。当我将整个结构移动到本地 C: 驱动器时,setup.py sdist 运行没有错误。
    • 所以听起来问题仍然可能是硬链接——我不能 100% 确定 Windows 是否支持网络驱动器上的硬链接,但 this MSDN article 暗示至少存在一些限制。出于兴趣,您是否尝试过我的建议,即在使用 USB 驱动器时删除 setup.py 顶部的 os.link() 方法,看看是否至少可以解决问题?
    猜你喜欢
    • 2021-11-21
    • 2017-11-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多