pydev - ide жалуется на импорт модуля - PullRequest
2 голосов
/ 14 октября 2011

ПРИМЕЧАНИЕ : я не принял ответ, потому что мой реальный вопрос - почему он помечается как ошибка компиляции. Я проголосовал за ответ @TorelTwiddler, потому что он дал обходной путь, но я хотел бы понять проблему.


У меня есть простой модуль, который содержит код для самопроверки. Для облегчения использования в интерактивном сеансе код самопроверки перезагружается (модуль).

Это нормально работает как в PyDev (RunAs), так и в интерактивном окне (после ручного изменения sys.path и импорта); но PyDev IDE все еще выдает ошибку 'compile' / red-X в строке

import Mod1  

Причина, по которой я import Mod1 сама по себе, заключается в том, что имя должно быть разрешено в любом контексте, в котором выполняется Test(), чтобы перезагрузка прошла успешно. Например, если вы импортируете MyMain из нового интерактивного окна, вызов reload завершится неудачно без импорта, поскольку имя Mod1 неизвестно.

Есть ли способ, как я могу это исправить? Mod1 является частью гораздо более крупного проекта, и его постоянная пометка как некомпилирующая делает разработку более сложной ...

Модуль с проблемой:

# Mod1.py
def Test():
    """ 
    run the self-test, but first force a reload of the module under test (this mod)
    """        
    import Mod1      # *****'COMPILE' ERROR HERE******  
    import imp
    Mod1 = imp.reload(Mod1)

    TestImpl()

def TestImpl():
    """
    self test here
    since I reload above, I can change this code and re-run from an interactive window
    this has to be a seperate function for the reload in Test to have an effect on this code
    """ 
    print(input("enter"))

Дополнительный модуль начальной загрузки, используемый только в PyDev (так что я могу «запустить как»)

# MyMain.py
import Mod1
Mod1.Test()

PyDev / Project PYTHONPATH (отображается правильно, эта папка находится в корне моей рабочей области). Так как он действительно работает в PyDev, он определенно правильный?

/MyDirectory

Спасибо!

Ответы [ 4 ]

2 голосов
/ 14 октября 2011

Я бы, вероятно, согласился с ответом Снаксиба, однако, если вы предпочитаете сохранить текущий формат, вы можете заставить Eclipse игнорировать ошибку, добавив #@UnresoledImport в конце вашей строки (нажмите Ctrl-1, чтобы автоматически заполнить его в).

2 голосов
/ 14 октября 2011

Добавление отдельного ответа из обсуждения ответа Снаксиба для форматирования.

Имейте один модуль, который не изменяется, TestMyStuff и другой, который вы обновляете с вашими изменениями, TheTest.

#TestMyStuff.py
def go():
    import TheTest
    reload(TheTest)
    TheTest.runTest()

и

#TheTest.py
def runTest():
    #run my tests and change things often here.
    print(input("enter"))

Теперь из итеративной оболочки вы сможете запустить TestMyStuff.go(), который будет TheTest перезагружаться при каждом запуске.

2 голосов
/ 14 октября 2011

Если вы перезагрузите модуль внутри себя, вы создадите бесконечный цикл, потому что вы перезагрузите модуль только для повторной загрузки модуля, и снова и т. Д.

В вашем MyMain.py вы могли бычтобы сделать это:

import Mod1
reload(Mod1)

Mod1.Test()

Я думаю, без дополнительных примеров кода трудно точно определить, ПОЧЕМУ вы должны перезагрузить модуль вообще, но если вам нужно, это должно работать (без выполнения этого в модуле)

1 голос
/ 30 марта 2012

Я пошел с аннотацией # @ UnresolvedImport , которая говорит PySide игнорировать ее. В моем случае реального обходного пути нет, так как при использовании pickle (я использую его косвенно через yaml) правильный путь импорта зависит от того, как был загружен модуль. Если вы хотите отобрать объект снаружи модуля, он не будет работать, если травление было сделано изнутри. Самовывоз дает вам такую ​​возможность.

...