shindos.Lab

プログラミング/音楽/書道をやってます。 いろいろ考えたり実験したことを書きます。たぶん。

Pythonで試しにパッケージをつくってみたものの

環境はMacOSXElcapitanconda envでPython3.5

まずはこんな感じでパッケージを作ってみた

$ mkdir package101
cd package101
  • __init__.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-

def greet():
    print('Hello, World!')
  • setup.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup
from setuptools import find_packages

def main():
    setup(
        name='package101',
        version='0.0.2',
        description='My first package',
        author='shindos',
        author_email='email@example.je',
        packages=find_packages(),
        entry_points={
            'console_scripts': [
                'greet = package101:greet',    
            ],
        }
    )

if __name__ == '__main__':
    main()

で、

$ python setup.py install

すれば、greetがコマンドとして作成できるはず。 が、

$ greet

とすると、以下のエラーがでた。

Traceback (most recent call last):
  File "/Applications/anaconda/envs/packaging/bin/greet", line 9, in <module>
    load_entry_point('package101==0.0.2', 'console_scripts', 'greet')()
  File "/Applications/anaconda/envs/packaging/lib/python3.5/site-packages/setuptools-20.7.0-py3.5.egg/pkg_resources/__init__.py", line 542, in load_entry_point
  File "/Applications/anaconda/envs/packaging/lib/python3.5/site-packages/setuptools-20.7.0-py3.5.egg/pkg_resources/__init__.py", line 2569, in load_entry_point
  File "/Applications/anaconda/envs/packaging/lib/python3.5/site-packages/setuptools-20.7.0-py3.5.egg/pkg_resources/__init__.py", line 2229, in load
  File "/Applications/anaconda/envs/packaging/lib/python3.5/site-packages/setuptools-20.7.0-py3.5.egg/pkg_resources/__init__.py", line 2235, in resolve
ImportError: No module named 'package101'

そんなパッケージないよと。いろいろ調べてpythonにパッケージのpathが通ってないのかと考えて PYTHONPATHに、パッケージのあるディレクトリを指定してみたけどだめ。

エラーになってる__init__.pyをみてみると、こんな感じ。

#!/Applications/anaconda/envs/packaging/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'package101==0.0.2','console_scripts','greet'
__requires__ = 'package101==0.0.2'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('package101==0.0.2', 'console_scripts', 'greet')()
    

ここで無理やり、以下を加えてsysにパッケージへのpathを追加してみた。

sys.path.append("/path/to/package")

そしたら、おお。うまくいった。

$ greet
Hello, World!

setuptoolからみてるsysと、コンソールから使ってるPythonのsysの中身が違う。 ということなので、たぶん使ってるPythonが違うのね。ということで PYTHONPATHに、パッケージのあるディレクトリを指定して __init__.pysetup.pyの最初の一行を#! /usr/bin/env pythonから Applications/anaconda/envs/packaging/bin/pythonに変更してもうまくいった。

$ greet
Hello, World!

シバンの問題だった。

print(sys.version)して、setup.pygreetしたときのpythonの差異をみようとしたけど一緒だった。 よくよく見たら勘違いで、ちゃんとPYTHONPATHにpathが通ってないだけだった。