2014-02-14 2 views
5

Я упаковываю скрипт в первый раз на python. Он может быть использован как в качестве модуля, и исполняемый файл, так что я узнал, что я мог бы использоватьentry_points не создает пользовательские скрипты с помощью pip, только с easy_install в Python

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

в моем setup.py автоматически генерировать скрипт в python-x.x.x/bin каталоге пользователя.

Мой питон скрипт заканчивается

if __name__ == '__main__': main() 

где main() разбирает ввод командной строки.

Я упаковано это с помощью команды:

python setup.py sdist 

, а затем протестировали распределение, как:

easy_install dist/myscript-0.3.2.tar.gz 

Это ставит myscript исполняемый файл в моем python-2.7.5/bin, как и ожидалось.

Но это не делает:

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='[email protected]', 
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', 
    ], 
} 
) 

ответ

1

Кажется что после загрузки пакета в PyPI с помощью команд thesepip install myscript разместил исполняемый файл в моем буфере python. Должно быть, это был локальный вопрос.

2

ли функция main действительно в mypackage пакете? Для этого он должен быть определен или импортирован в файл __init__.py этого пакета.

Если структура проекта выглядит следующим образом:

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

Затем вам нужно либо:

  • использование mypackage.main:main в вашем setup.py
  • записи from main import main в вашем __init__.py
+1

Спасибо за ваш ответ! Я действительно удалил термин «пакет» из моего вопроса, потому что я просто упаковываю скрипт, а не «пакет» в смысле python (т. Е. Папку с '__init __. Py'). Нет, я уверен, что 'entry_points' настроен правильно, потому что он работает, когда я устанавливаю с помощью' easy_setup'. –

2

У меня был подобный опыт pip install ., не работает из каталога проекта. Оказалось, что pip не выполнил всю логику setup.py, поскольку предполагал, что зависимость от моего проекта уже была выполнена, поскольку мой пакет был в sys.path, который включает рабочий каталог. Я нашел три обхода.Я мог бы использовать для редактирования или обновления флага, чтобы заставить его установить все:

pip install --editable .

pip install --upgrade .

Или я мог бы перейти в другую рабочую директорию и выполнить его абсолютный путь к директории проекта:

pip install $HOME/src/project_dir

+1

Спасибо, помощник. Израсходовано 10 часов из-за этого :(Вы, наконец, помогли мне ответить. –

+0

Рад, что я был не единственным, кто потратил впустую часы, выяснив это: P – JosiahJohnston