Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么要运行setup.py,我可以嵌入代码吗?_Python - Fatal编程技术网

Python 为什么要运行setup.py,我可以嵌入代码吗?

Python 为什么要运行setup.py,我可以嵌入代码吗?,python,Python,我正在编写一个依赖于几个库(Paramiko等)的clipython应用程序。 如果我下载它们的源代码并将它们放在我的主应用程序源代码下,我就可以导入它们,并且一切正常。 为什么我需要运行他们的setup.py安装程序或处理python包管理器 我知道,在部署服务器端应用程序时,管理员可以运行easy_install/pip命令等来安装prerequsites,但对于像CLI这样的脚本应用程序,它们必须作为只依赖python二进制文件的自包含应用程序分发,推荐的方法是什么?有几个原因: 并非所

我正在编写一个依赖于几个库(Paramiko等)的clipython应用程序。 如果我下载它们的源代码并将它们放在我的主应用程序源代码下,我就可以导入它们,并且一切正常。 为什么我需要运行他们的setup.py安装程序或处理python包管理器

我知道,在部署服务器端应用程序时,管理员可以运行easy_install/pip命令等来安装prerequsites,但对于像CLI这样的脚本应用程序,它们必须作为只依赖python二进制文件的自包含应用程序分发,推荐的方法是什么?

有几个原因:

  • 并非所有包都是纯python包。在软件包中包含C扩展并使
    setup.py
    自动化编译过程很容易

  • 自动依赖管理;依赖项由安装工具为您声明和安装(
    pip
    easy\u install
    zc.buildout
    )。依赖关系也可以动态声明(尝试导入
    json
    ,如果导入失败,请在
    simplejson
    上声明依赖关系,等等)

  • 自定义资源安装设置。安装过程是高度可配置和动态的。依赖关系检测也是如此;例如,
    cx_Oracle
    必须跨越许多障碍,以便在需要支持的各种平台和Oracle库分发选项的怪癖下直接安装


为什么您仍然希望对CLI脚本执行此操作?这取决于CLI对您的重要性;在未来的几年里,你会保持这种状态吗?然后我仍然使用
setup.py
,因为它记录了依赖关系,包括最低版本需求。您可以添加测试(
python setup.py test
),并轻松地部署到新位置或升级依赖项。

setup.py是也允许C编译包的通用方法。但在许多情况下,它只是复制代码。关键是它非常容易分发,理想情况下,用户根本不需要知道使用的是python——说明应该是:将给定的.tgz提取到一个目录(假设某个Linux分发,包含某个版本的python)并从那里运行/bin/。如果任何库都有依赖项,我是否可以在构建时进行所有打包和遍历(假设没有本机库),然后只分发一个自续归档文件?@Ivan:如果目标用户安装了正确的python版本,当然可以这样做。但是如果这是一个CLI,那么运行
python setup.py somecommand
?Martijn,那么您建议(比如)使用root用户必须首先运行的setup.sh,在使用的每个库上运行“python setup.py install”,这将把它们复制到机器范围内,并执行所有必需的库设置?@Ivan:
setup.py
可以执行就地安装。你可以使用虚拟电视。您可以使用
zc.buildout
(这就是我要使用的,可以更好地控制东西的安装位置)。