entry_points不会使用pip创建自定义脚本,只能使用Python中的easy_install

6 python pip setuptools easy-install python-2.7

我在python中第一次打包脚本.它可以用作模块和可执行文件,所以我发现我可以使用它

entry_points = {
    'console_scripts': [
        'myscript = myscript:main',
    ],
}
Run Code Online (Sandbox Code Playgroud)

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

我的python脚本以.结尾

if __name__ == '__main__': main()
Run Code Online (Sandbox Code Playgroud)

其中main()解析命令行输入.

我使用命令打包它:

python setup.py sdist
Run Code Online (Sandbox Code Playgroud)

然后测试分布为:

easy_install dist/myscript-0.3.2.tar.gz
Run Code Online (Sandbox Code Playgroud)

这将myscript可执行文件放入我python-2.7.5/bin的预期中.

但这不是:

pip install dist/myscript-0.3.2.tar.gz
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?我的目录树看起来像:

Root/
|-- MANIFEST.in
|-- README.rst
|-- dist
|   `-- myscript-0.3.2.tar.gz
|-- myscript.egg-info
|   |-- ...
|-- myscript.py
|-- setup.cfg
|-- setup.py
`-- test
    |-- ...
Run Code Online (Sandbox Code Playgroud)

我的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',
  ],
 }
)
Run Code Online (Sandbox Code Playgroud)

Jos*_*ton 5

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


小智 1

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