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__.py
とsetup.py
の最初の一行を#! /usr/bin/env python
からApplications/anaconda/envs/packaging/bin/python
に変更してもうまくいった。
$ greet Hello, World!
シバンの問題だった。
print(sys.version)
して、setup.py
とgreet
したときのpythonの差異をみようとしたけど一緒だった。
よくよく見たら勘違いで、ちゃんとPYTHONPATH
にpathが通ってないだけだった。