Найти - Пользователи
Полная версия: вопрос про import
Начало » Python для новичков » вопрос про import
1
k0st1an
Есть пакет

./
├── 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), ну так и должно быть…
k0st1an
А вот этот скрипт из домашнего каталога работает на ура

$ ./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
k0st1an
Имя скрипта было такое же как модуля….. Так делать не надо. Дурдом… Совсем вылетело из головы.
JOHN_16
Возможно стоит принять общую практику и пакет обозначить как библиотеку, для чего в названии часто применяют суффикс “lib”.
k0st1an
Хорошая идея.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB