【问题标题】:entry_points does not create custom scripts with pip, only with easy_install in Pythonentry_points 不使用 pip 创建自定义脚本,仅使用 Python 中的 easy_install
【发布时间】:2014-03-13 22:54:11
【问题描述】:

我是第一次在 python 中打包一个脚本。它既可以用作模块,也可以用作可执行文件,所以我发现我可以使用

entry_points = {
    'console_scripts': [
        'myscript = myscript:main',
    ],
}

在我的setup.py 中自动生成用户的python-x.x.x/bin 目录中的脚本。

我的python脚本以

结尾
if __name__ == '__main__': main()

main() 解析命令行输入。

我使用命令打包了这个:

python setup.py sdist

然后将分布测试为:

easy_install dist/myscript-0.3.2.tar.gz

这会按预期在我的python-2.7.5/bin 中放置一个myscript 可执行文件。

但这不是:

pip install dist/myscript-0.3.2.tar.gz

任何想法为什么?我的目录树如下所示:

Root/
|-- MANIFEST.in
|-- README.rst
|-- dist
|   `-- myscript-0.3.2.tar.gz
|-- myscript.egg-info
|   |-- ...
|-- myscript.py
|-- setup.cfg
|-- setup.py
`-- test
    |-- ...

而我的setup.py 大致如下:

import os

from setuptools import setup

def read(*paths):
 """Build a file path from *paths* and return the contents."""
 with open(os.path.join(*paths), 'r') as f:
  return f.read()

setup(
 name='myscript',
 version='0.3.2',
 description='bla',
 long_description=(read('README.rst')),
 url='http://url',
 license='LGPL',
 author='Me',
 author_email='me@me.com',
 py_modules=['myscript'],
 include_package_data=True,
 classifiers=[
  'Development Status :: 5 - Production/Stable',
  'Intended Audience :: Developers',
  'Natural Language :: English',
  'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
  'Operating System :: OS Independent',
  'Programming Language :: Python',
  'Programming Language :: Python :: 2',
  'Programming Language :: Python :: 2.7',
  'Topic :: Software Development :: Libraries :: Python Modules',
 ],
 install_requires=['Texttable'],
 entry_points = {
  'console_scripts': [
   'myscript = myscript:main',
  ],
 }
)

【问题讨论】:

    标签: python python-2.7 pip setuptools easy-install


    【解决方案1】:

    我有过类似的pip install . 没有在项目目录中工作的经历。事实证明,pip 没有执行所有 setup.py 逻辑,因为它假设我的项目的依赖关系已经满足,因为我的包位于 sys.path 中,其中包括工作目录。我找到了三个解决方法。我可以使用可编辑或升级标志来强制它安装所有内容:

    pip install --editable . -- 可能有效(但取决于本地 pip 配置)

    pip install --upgrade . -- 有效

    pip install --upgrade-strategy=only-if-needed . -- 工作

    或者我可以转到另一个工作目录并使用项目目录的绝对路径执行它:

    pip install $HOME/src/project_dir

    【讨论】:

    • 谢谢伙计。因此浪费了10个小时:(你的回答终于帮助了我。
    • 很高兴我不是唯一一个浪费时间解决这个问题的人:P
    【解决方案2】:

    main 函数真的在 mypackage 包中吗?为此,它应该在该包的__init__.py 文件中定义或导入。

    如果您的项目结构如下所示:

    mypackage/
    ├── mypackage/
    │   ├── __init__.py
    │   └── main.py
    └── setup.py
    

    那么你需要:

    • 在您的setup.py 中使用mypackage.main:main
    • 在您的__init__.py 中写入from main import main

    【讨论】:

    • 感谢您的回答!我实际上已经从我的问题中删除了“包”一词,因为我只是在打包一个脚本,而不是 Python 意义上的“包”(即带有__init__.py 的文件夹)。所以不,我很确定 entry_points 设置正确,因为当我使用 easy_setup 安装时它可以工作。
    【解决方案3】:

    似乎在使用 these 指令将包上传到 PyPI 后,pip install myscript 确实在我的 python bin 中放置了一个可执行文件。一定是本地问题。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 2010-10-30
      • 2023-03-12
      • 2019-03-04
      • 1970-01-01
      • 2016-04-26
      • 2010-11-05
      • 2021-12-18
      • 2018-05-27
      相关资源
      最近更新 更多