2015-07-22 3 views
-2

Я мои настройки сценариев следующим образом -Python вопрос зависимость

a.py (Добавленный сценарий)

from b import B 
import c 

class A(B): 
def process(self): 
    super().method() 
    c.method1() 
    c.method2() 

b.py (существующий сценарий в Prod)

import c 
class B(Exception): 
def method(self): 
    c.method1() 
    c.method2() 

c.py (существующий сценарий в Prod)

def method1()... 
def method2()... 

Dir's hold b.py & c.py все находятся в PATH на хосте PROD.

Когда я вызываю a.py из планировщика, я получаю ошибку 'module' object has no attribute method(). Также метод1() & method2() в b.py не выполняется.

a.py находится в том же каталоге, что и b.py, поэтому я предполагаю, что ничего не нужно обновлять в PATH.

Я искал здесь в SO и обнаружил, что это может быть проблема с круговой зависимостью, однако некоторые из предложенных решений в моем случае не работали.

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

+1

Я не вижу никаких круговых зависимостей в вашем коде. Что означает 'super(). Method()'? –

+0

Метод super(). Method() должен вызывать метод в b.py, который он делает. Я импортирую c, указанный в файле a.py & b.py, что заставляет меня полагать, что существует проблема с циклической зависимостью. – Murali

+0

Если это так, то это не может быть полный код, являются ли эти вызовы фактически внутри класса в вашем фактическом коде? –

ответ

0
  • Что вы ожидаете super(), чтобы вернуться? Он предназначен для вызова внутри метода класса, а не непосредственно внутри модуля.
  • Я ожидаю увидеть определение класса или функции B в b.py, так как это то, что вы импортируете в a.py.
+0

Да, super() вызывается изнутри метода, и есть класс B в b.py. Я не хотел перечислять свой код здесь, поэтому просто дал основные фрагменты. – Murali

0

Обновление моего предыдущего ответа (который был около indenation)

Таким образом я пытался воспроизвести вашу проблему. Это то, что у меня есть:

a.py

от импорта б В импорт с

class A(B): 
    def __init__(self): 
     super().__init__() 
     print('a init') 

    def process(self): 
     super().method() 
     c.method1() 
     c.method2() 


a = A() 
a.process() 

b.py

import c 

class B(Exception): 
    def __init__(self): 
     print('b init') 

    def method(self): 
     print('b start') 
     c.method1() 
     c.method2() 
     print('b done') 

c.py

def method1(): 
    print(1) 

def method2(): 
    print(2) 

Вызов a.py из командной строки: python3.4 a.py мой выход:

b init 
a init 
b start 
1 
2 
b done 
1 
2 

(что и следовало ожидать) Т.Л., д-р: не мог воспроизвести.

+0

У меня уже есть несколько downvotes для этого :). Однако в моем фактическом коде все правильно отступы, включая определение класса и т. Д. В то время как скопировать вставку я, возможно, пропустил какой-то отступ, заставляющий его выглядеть неформатированным. Сожалею. – Murali

+0

Я запускал это на обоих python 2.7 и 3.4 .... python 2.7 дал мне 'TypeError: super() принимает как минимум 1 аргумент (0 задан)', тогда как python 3.4 работает отлично. Как вы вызываете a.py? – Zaxvo

+0

Давая полный путь для a.py. Dir, которые хранят эти скрипты, являются частью переменной env PYTHONSCRIPTS, которая включена в путь. – Murali

0

Прежде всего - не используйте метод super().() Для доступа к методу родителя. Это необязательно. метод процесса класса A должен быть:

def process(self): 
    self.testmethod() 
    c.method1() 
    c.method2() 

Вы не разместили достаточно кода, чтобы действительно показать ошибку.

Когда я переопределять process, как указано выше, и создания экземпляра объекта класса А:

tester = A() 
tester.process() 

метод работает процесс, как и ожидалось.

Смежные вопросы