Python проблема импорта - Относительные пути - PullRequest
0 голосов
/ 07 февраля 2020

У меня проблема с импортом при работе с этим многофайловым проектом.

Это структура каталогов

aluminium@aluminium:~/Desktop/mad/build/lib$ ls -R
./madesigner.py 
./madgui:
    build_tab_ui.py      flap_ui.py          overview.py        sheet_ui.py        trailing_edge_ui.py
    combobox_nowheel.py  __init__.py         simple_hole_ui.py  version.py
    creator_ui.py        leading_edge_ui.py  shaped_hole_ui.py  spar_ui.py         wing_ui.py

./madlib:
    ac3d.py     builder.py  freecad.py   layout.py    spline.py     test.py
    airfoil.py  contour.py  __init__.py  structure.py  wing.py

Первые несколько операторов импорта из freecad. Файл py выглядит следующим образом:

import sys
import os.path

# path to your FreeCAD.so or FreeCAD.dll file
FREECADPATH = '/usr/lib/freecad-python3/lib/'
sys.path.append(FREECADPATH)
import FreeCAD
import Part, Mesh
from FreeCAD import Base

Первые несколько операторов импорта файла builder.py выглядят следующим образом

from . import ac3d
from . import freecad
from . import contour
from .wing import Wing

Теперь, когда я пытаюсь выполнить ./madesigner.py, это трассировка стека. Я получаю следующий порядок вызова
madesigner.py -> mad gui .creator_ui -> madlib.builder import Builder->. import freecad

aluminium@aluminium:~/Desktop/mad/build/lib$ python madesigner.py
Traceback (most recent call last):
  File "madesigner.py", line 14, in <module>
    from madgui.creator_ui import CreatorUI
  File "/home/aluminium/Desktop/mad/build/lib/madgui/creator_ui.py", line 31, in <module>
    from madlib.builder import Builder
  File "/home/aluminium/Desktop/mad/build/lib/madlib/builder.py", line 17, in <module>
    from . import freecad
  File "/home/aluminium/Desktop/mad/build/lib/madlib/freecad.py", line 13, in <module>
    import FreeCAD
ImportError: /home/aluminium/anaconda3/lib/python3.7/site-packages/PyQt5/../../../libQt5Core.so.5: version `Qt_5.12' not found (required by /usr/lib/freecad-python3/lib/libFreeCADApp.so)

Независимо от этой ошибки PyQt5, когда я на самом деле go захожу в ./madlib и выполняю freecad.py, она прекрасно работает как в виде файла, так и в виде модуля

aluminium@aluminium:~/Desktop/mad/build/lib/madlib$ python freecad.py 
FreeCAD 0.18.4, Libs: 0.18.4R
aluminium@aluminium:~/Desktop/mad/build/lib/madlib$ python -m freecad
FreeCAD 0.18.4, Libs: 0.18.4R

И когда я пытаюсь скомпилировать builder.py, я получаю следующую ошибку, которая очень странная, поскольку ac3d.py и builder.py находятся в одном каталоге.

aluminium@aluminium:~/Desktop/mad/build/lib/madlib$ python -m builder
Traceback (most recent call last):
  File "/home/aluminium/anaconda3/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/aluminium/anaconda3/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/aluminium/Desktop/mad/build/lib/madlib/builder.py", line 16, in <module>
    from . import ac3d
ImportError: attempted relative import with no known parent package

После пробуя около сотни или около того SE сообщений, я не мог понять, что происходит.

  1. И madlib, и mad gui имеет __init__.py "файлы
  2. Разработчик Вчера этот проект зафиксировал эти файлы в GitHub, подтвердив, что он работает (после того, как сам проверил это). Поэтому не нужно вносить никаких изменений в файл
  3. FreeCAD.so, импортированный из точного путь, поэтому относительный путь не должен входить в игру.

Может кто-нибудь указать, что мне не хватает и почему я получаю эту ошибку?

...