【问题标题】:How to use setuptools to install a python script for windows command line?如何使用 setuptools 为 windows 命令行安装 python 脚本?
【发布时间】:2016-06-04 15:08:45
【问题描述】:

我一直在开发一个 python 命令行应用程序,我希望它可以从 Windows 上的命令提示符以及 OSX 和 linux 上的终端运行。 我的目标是制作一个 pip 模块,让我的应用程序在安装后就可以在命令行上使用。

使用安装工具,我能够使用以下命令让脚本在 linux 和 OSX 上运行:

youtube-song-downloader <search query>

运行后:

python setup.py install

通过 pip 安装后也可以直接使用

但是当我尝试在windows上使用相同的setup.py时,它无法识别命令(可能是它没有添加到路径中)

如何通过 pip install 或 setup.py install 使我的脚本在 Windows 命令行上可用?

我的 setup.py:

#!/usr/bin/env python

from setuptools import setup

setup(name='youtube-song-downloader',
      version='0.1',
      description='A program used to search and download songs from Youtube.',
      url='https://github.com/dszopa/youtube-song-downloader',
      author='Daniel Szopa',
      author_email='dszopa@iastate.edu',
      license='MIT',
      install_requires=[
          'youtube_dl',
          'google-api-python-client',
          'pytest',
      ],
      packages=['ytsdl'],
      scripts=['bin/youtube-song-downloader'],
      include_package_data=True,
      zip_safe=False)

我的程序结构如下:

+ bin
  - youtube-song-downloader
+ tests
+ ytsdl
  - songDownloader.py
  - settings.json
- .gitignore
- MANIFEST.in
- requirements.txt
- setup.py

如果您对我的代码有任何疑问,我的 github 仓库是 here


编辑 1

我将此添加到我的 setup.py 中

  entrypoints={
    'console_scripts': [
      'youtube-song-downloader = ytsdl:main',
    ]
  },

我还创建了一个__main__.py

#!/usr/bin/env python

import sys
import os
import ytsdl

if __name__ == "__main__":
  main()

def main():
  #script from bin/youtube-song-downloader

并且还将__main__ 添加到我的__init__from .ytsdl import __main__

我很不确定我是否朝着正确的方向前进,程序编译但没有运气使用相同的命令

【问题讨论】:

  • 对 Windows 最好的做法是进行设置,以便人们可以通过 py [-X[.Y[-32]]] -m ytsdl 运行您的脚本。为此,请将__main__.py 脚本添加到包中。您可以让脚本运行ytsdl.main 函数。这个main 函数也是automatic script creation 的入口点。这将在 Windows 上创建脚本和 EXE。 “脚本”目录通常不在搜索 PATH 上,但它会用于活动的 venv 环境。
  • 那么我基本上是想将我在 youtube-song-downloader 脚本中的内容放入 ytsdl 的主函数中,然后为其设置入口点吗?如果我对 console_script 的 package.module:method 部分的语法有点困惑
  • main 放入您的__init__.py。那么控制台脚本入口点是'youtube-song-downloader=ytsdl:main'。不要忘记与py -m ytsdlpython -m ytsdl 一起使用的__main__.py 脚本。
  • 这是entry_points,而不是entrypointsmain 函数位于 __init__.py 模块中。 __main__.py 导入 ytsdl 并调用 ytsdl.main()
  • 这篇文章对如何打包命令行 Python 包有一个很好的整体解释:gehrcke.de/2014/02/… 还有一个示例 repo:github.com/jgehrcke/python-cmdline-bootstrap 两者都对我很有帮助。

标签: python windows pip setuptools


【解决方案1】:
  1. 开发时,请确保所有脚本文件的名称中包含名称中包含“python”(#!/usr/bin/env python)的shebang,该脚本文件应稍后由用户直接执行,甚至稍后目标平台上的路径不同(@987654321 @)
  2. 将所有用户可调用的脚本放入setup 调用的scripts 参数中,如您所展示的那样(尽管我不会省略.py 扩展名)。

一旦使用pip install 安装在目标平台上,目标shebang 就会被替换为合适的,并且脚本会放在找到它们的路径中。

如果用户正确设置了 Python,她应该能够在不添加 python 的情况下使用它们。

例如,对于 Windows,Python Launcher (py.exe) 应该与 .py 文件相关联,这是在 Python 设置期间可选提供的。要省略 .py 扩展,.py 可以在 PATHEXT 环境变量中。

【讨论】:

    最近更新 更多