【问题标题】:How to run a python script installed from distutils如何运行从 distutils 安装的 python 脚本
【发布时间】:2015-03-01 10:36:32
【问题描述】:

我有一个中等大小的 python 命令行程序,可以很好地从我的源代码运行,我创建了一个源分发文件并使用“python setup.py install”将其安装到虚拟环境中

由于这是一个纯 Python 程序,并且假设最终用户已经安装了 Python 和所需的包,我的想法是我可以通过 PyPi 将它作为源代码分发到所有可用平台。

安装后,我在 virtualenv site-packages 目录中获得了一个 'appname' 目录,当我编写 "python 'pathtovirtualenv'/Lib/sitepackages/'myappname' 时它也可以正常运行

但这是最终用户应该从命令行运行 distutils 分布式程序的方式吗?

我找到了很多关于如何使用 distutils 分发程序的信息,但没有关于最终用户在安装后应该如何启动它的信息。

【问题讨论】:

    标签: python setuptools distutils setup.py


    【解决方案1】:

    由于您已经创建了setup.py,我建议您查看entry_points

      entry_points={
          'console_scripts': [
              'scriptname=yourpackage.module:function',
          ],
      },
    

    在这里,你有一个名为yourpackage的包,其中有一个名为module的模块,你引用了函数function。这个函数会被一个叫做scriptname的脚本包裹起来,这个脚本会安装在用户bin文件夹中,这个文件夹通常在$PATH,所以用户在通过@987654333安装你的包后可以简单地输入scriptname @。

    总结一下:用户将通过pip install yourpackage 安装包,最后可以通过script name 调用module 中的function

    这里有一些关于这个主题的文档:

    https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation http://www.scotttorborg.com/python-packaging/command-line-scripts.html

    【讨论】:

    • 忘了说我是在windows上开发的,需要在windows上测试。 Windows 没有放置命令行应用程序的标准位置(应该有?)。我想上面的方法适用于 linux 和 osx。
    • 所以应该是 script=myapp.__main__.py:main?
    • 它应该可以正常工作。阅读一些关于这方面的主题,我没有任何 Windows 经验(我不会改变它;)
    • @user29809 没有.py,因为您指的是__main__ 模块(就像您导入它时一样)。
    • 好吧,我也在使用 Python2.7,它无法识别 setup() 的 entry_point 选项。
    【解决方案2】:

    好吧,我终于想通了。

    最初,我只想使用 distutils,我喜欢它,因为最终用户可以以最少的额外依赖项安装它。但我现在发现 setuptools 在我的情况下是更好的选择。

    我的目录结构如下(Subversion):

    trunk
      |-- appname
      |     |-- __init__.py   # an empty file
      |     |-- __main__.py   # calls appname.main()
      |     |-- appname.py    # contains a main() and imports moduleN
      |     |-- module1.py
      |     |-- module2.py
      |     |-- ...
      |-- docs
      |     |-- README
      |     |-- LICENSE
      |     |-- ...
      |-- setup.py
    

    而我的setyp.py 基本上是这样的:

    # This setup file is to be used with setuptools source distribution
    # Run "python setup sdist to deploy
    
    from setuptools import setup, find_packages
    
    setup( name = "appname",
           ...
           include_package_data = True,
           packages = find_packages(),
           zip_safe = True,
           entry_points = {
               'console_scripts' : 'appname=appname.appname:main'
           }
       )
    

    现在下一步是弄清楚如何在用户计算机上安装 docs 目录的内容。

    但现在,我正在考虑在主脚本中添加 --readme、--license、--changes、--sample(等等)选项,以便在运行时显示它们。

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 2011-04-18
      • 2020-08-17
      • 1970-01-01
      • 2010-09-19
      • 2010-11-22
      • 2021-12-14
      • 2015-11-18
      相关资源
      最近更新 更多