jacksparrow007
jacksparrow007

Reputation: 1328

python import error, import class from another file

I am trying to import the class PBase which is in base.py(its in the same folder)

So I am doing the following

from base import PBase

but I am getting the following error

Traceback (most recent call last):
  File "test_pricing.py", line 9, in <module>
    from base import PBase
ImportError: cannot import name PBase

here is my base.py

import yaml
import unittest, time, re

class PBase(unittest.TestCase):
    def enter_credentials(self, username, password):
        self.driver.find_element_by_id("id_username").clear
        self.driver.find_element_by_id("id_username").send_keys(username)
        self.driver.find_element_by_id("id_password").clear
        self.driver.find_element_by_id("id_password").send_keys(password)
        self.driver.find_element_by_css_selector("input.btn.btn-success").click()

    def get_credentials(self):
        with open('credentials.yml', 'r') as f:
            doc=yaml.load(f)
        return doc        

    def is_user_logged_in(self):
        f= "Account" in self.driver.find_element_by_css_selector(".navbar").text
        return f

    def log_in_user(self):
        self.driver.get(self.login_url)
        user_dict=self.get_credentials()
        username=user_dict["user"]["username"]
        password=user_dict["user"]["password"]
        self.enter_credentials(username, password)
        self.assertEqual(self.expected_logged_in_title, self.driver.title)

    def wait_for_chat_window(self, timeout=5):
        WebDriverWait(self.driver, timeout, poll_frequency=0.1).until(lambda b: b.find_element_by_id('habla_beta_container_do_not_rely_on_div_classes_or_names').is_displayed())
        time.sleep(3)

    def close_modal_window(self):
        driver=self.driver
        driver.find_element_by_xpath('//a[@class="close"]').click()


    def tearDown(self):
        if self.is_final_test==1:
            self.driver.quit()

Upvotes: 1

Views: 924

Answers (1)

potato8u2
potato8u2

Reputation: 11

This might be an issue caused by importing in a circular way. For example one tries to import from Bar from bar.py that requires Foo from foo.py that requires Utils that is defined in bar.py:

foo.py:

from bar import Utils


class Foo:
    def __init__(self):
        print("hello, from Foo")
        Utils.do_something()

and bar:

from foo import Foo


class Utils:
    @staticmethod
    def do_something():
        print("done something")


class Bar(Foo):
    def __init__(self):
        print('Hi, from Bar')

This gives similar issues where one can import bar inside foo.py without any issue, but once one tries to make any reference to the class Utils inside foo.py one gets various errors, for example the previous code results in:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from bar import Bar
  File "bar.py", line 1, in <module>
    from foo import Foo
  File "foo.py", line 1, in <module>
    from bar import Utils
ImportError: cannot import name 'Utils' from 'bar' (bar.py)

The issue is easily solved by placing Utils in its own file.

Upvotes: 1

Related Questions