Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 17, 2015 22:29:09

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про import

Есть пакет

./
├── im11
│   ├── __init__.py
│   ├── m1.py
│   ├── m2.py
├── im11.py
└── setup.py

__init__.py пустой, содержит переменные для setup.py.

im11.py
#!/usr/bin/env python3
import im11.m2
im11.m2.m2_show()

m1.py
def m1_show():
    print('m1.show')

m2.py
import im11.m1
def m2_show():
    im11.m1.m1_show()
    print('m2.show')

setup.py
from setuptools import setup
import im11
setup(
    name='im11',
    version=im11.__version__,
    author=im11.__author__,
    author_email=im11.__email__,
    url='www.com',
    packages=['im11'],
    scripts=['im11.py']
)

В такой конфигурации делаю следующее:

python3 setup.py sdist
....
sudo pip3 install dist/<tar.gz>
....

Вот плный вывод

$ sudo pip3 -v install dist/im11-0.0.1.tar.gz 
Unpacking ./dist/im11-0.0.1.tar.gz
  Running setup.py (pathtmp/pip-4b1kou8v-build/setup.py) egg_info for package from file//home/k0st1an/develop/testutils/python/path_import/dist/im11-0.0.1.tar.gz
    running egg_info
    creating pip-egg-info/im11.egg-info
    writing dependency_links to pip-egg-info/im11.egg-info/dependency_links.txt
    writing pip-egg-info/im11.egg-info/PKG-INFO
    writing top-level names to pip-egg-info/im11.egg-info/top_level.txt
    writing manifest file 'pip-egg-info/im11.egg-info/SOURCES.txt'
    warning: manifest_maker: standard file '-c' not found
    
    reading manifest file 'pip-egg-info/im11.egg-info/SOURCES.txt'
    writing manifest file 'pip-egg-info/im11.egg-info/SOURCES.txt'
Installing collected packages: im11
  Running setup.py install for im11
    running install
    running build
    running build_py
    creating build
    creating build/lib
    creating build/lib/im11
    copying im11/m1.py -> build/lib/im11
    copying im11/__init__.py -> build/lib/im11
    copying im11/m2.py -> build/lib/im11
    running build_scripts
    creating build/scripts-3.5
    copying and adjusting im11.py -> build/scripts-3.5
    changing mode of build/scripts-3.5/im11.py from 644 to 755
    running install_lib
    creating /usr/local/lib/python3.5/dist-packages/im11
    copying build/lib/im11/m1.py -> /usr/local/lib/python3.5/dist-packages/im11
    copying build/lib/im11/__init__.py -> /usr/local/lib/python3.5/dist-packages/im11
    copying build/lib/im11/m2.py -> /usr/local/lib/python3.5/dist-packages/im11
    byte-compiling /usr/local/lib/python3.5/dist-packages/im11/m1.py to m1.cpython-35.pyc
    byte-compiling /usr/local/lib/python3.5/dist-packages/im11/__init__.py to __init__.cpython-35.pyc
    byte-compiling /usr/local/lib/python3.5/dist-packages/im11/m2.py to m2.cpython-35.pyc
    running install_egg_info
    running egg_info
    writing top-level names to im11.egg-info/top_level.txt
    writing dependency_links to im11.egg-info/dependency_links.txt
    writing im11.egg-info/PKG-INFO
    warning: manifest_maker: standard file '-c' not found
    
    reading manifest file 'im11.egg-info/SOURCES.txt'
    writing manifest file 'im11.egg-info/SOURCES.txt'
    Copying im11.egg-info to /usr/local/lib/python3.5/dist-packages/im11-0.0.1.egg-info
    running install_scripts
    copying build/scripts-3.5/im11.py -> /usr/local/bin
    changing mode of /usr/local/bin/im11.py to 755
    writing list of installed files to '/tmp/pip-98yjq7ma-record/install-record.txt'
Successfully installed im11
Cleaning up...

Как видно установка прошла успешно. Создан нужный файл /usr/local/bin/im11.py. Пытаюсь проверить работу

$ im11.py 
Traceback (most recent call last):
  File "/usr/local/bin/im11.py", line 3, in <module>
    import im11.m2
  File "/usr/local/bin/im11.py", line 3, in <module>
    import im11.m2
ImportError: No module named 'im11.m2'; 'im11' is not a package

Не может найти модуль. Пытаюсь по другому:

$ python3
Python 3.5.0+ (default, Oct 11 2015, 09:05:38) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import im11.m2
>>> im11.m2.m2_show()
m1.show
m2.show

Ммм….Что не так-то???

Я сравнил вывод sys.path из скрипта и через консоль python:

скрипт
['/usr/local/bin', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']

консоль
>>> sys.path
['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']

Разница только в sys.path(0), ну так и должно быть…



—-
memento mori

Отредактировано k0st1an (Дек. 17, 2015 22:31:27)

Офлайн

#2 Дек. 17, 2015 22:37:50

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про import

А вот этот скрипт из домашнего каталога работает на ура

$ ./t.py 
['/home/k0st1an', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
m1.show
m2.show

#!/usr/bin/python3.5
import sys
print(sys.path)
import im11.m2
im11.m2.m2_show()


А Если его переместить в /usr/local/bin/ опять ошибка

$ t.py 
['/usr/local/bin', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
['/usr/local/bin', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
Traceback (most recent call last):
  File "/usr/local/bin/t.py", line 6, in <module>
    import im11.m2
  File "/usr/local/bin/im11.py", line 6, in <module>
    import im11.m2
ImportError: No module named 'im11.m2'; 'im11' is not a package



—-
memento mori

Офлайн

#3 Дек. 18, 2015 01:15:19

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про import

Имя скрипта было такое же как модуля….. Так делать не надо. Дурдом… Совсем вылетело из головы.



—-
memento mori

Офлайн

#4 Дек. 18, 2015 03:48:00

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

вопрос про import

Возможно стоит принять общую практику и пакет обозначить как библиотеку, для чего в названии часто применяют суффикс “lib”.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Дек. 18, 2015 10:13:52

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про import

Хорошая идея.



—-
memento mori

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version