Import hatası python

Merhaba,
Python 'da import sorunu yaşıyorum. (sürüm Python 3.6.9)
Üst klasörde ki dosyaları import etmek istediğimde hata veriyor,
Birçok yol denedim ama sorunun ne olduğunu anlayamadım:

-topfolder 
    alltestfunc.py
    -subfolder
        update_test.py

Yapmak istediğim sadece update_test.py içerisinde alltestfunc.py dosyasını import etmek, bu kadar.
Duruma göre verdiği hatalar:

ModuleNotFoundError: No module named 'alltestfunc'
ValueError: attempted relative import beyond top-level package

vb…

Teşekkürler

İçe aktarma işlemini yapan kodu da atın.

Merhaba, kodları aşağıda ki linklere yapıştırdım.


Şimdi bunlar bir parent folder altında 2 child folder içerisinde 2 dosya. Birini diğerine import ediyorum, ama sürekli hata veriyor.

Merhaba, şöyle yapabilirsiniz:

Ağaç yapısı aşağıdakine benzer olsun.

.
├── run.py
└── topfolder
    ├── alttestfunc.py
    └── subfolder
        └── update_test.py

update_test.py

from ..alttestfunc import __name__ as x

print(
    f"Bu dosyanın adı {repr(__name__)}.\n"
    f"Ve bu dosyaya {repr(x)} dosyası import edildi."
)

alttestfunc.py

# Boş

run.py

from topfolder.subfolder import update_test

Özetle, üst dizindeki bir python dosyasını import eden script doğrudan çalıştırılmamalıdır. Eğer böyle bir import zorunlu ise, en üst dizinde yer alan, run.py gibi bir dosya kullanılmalı.

run.py’yi çalıştırdığımız zaman alacağımız çıktı şöyle olacaktır.

Bu dosyanın adı 'topfolder.subfolder.update_test'.
Ve bu dosyaya 'topfolder.alttestfunc' dosyası import edildi.

Merhaba,
Belirttiğiniz şekilde yapılandırdım, şimdi hata mesajı vermiyor,
print leri de consola basıyor ancak test dosyası herhangi bir çıktı üretmiyor,
yani error yok ama hiçbir geri dönüşte yok,
test dosyasının içinde main koşuluda belirtili, aklımada başka birşey gelmiyor?

Test dosyasının nasıl bir çıktı üretmesi lazım? Test dosyası __main__ mi ki siz __main__ koşulu eklediniz? __main__ olan dosya, üst dizinlerde yer almıyor mu?

Verdiğiniz yanıt çözümü sağlıyor görünüyor.

Diğer kısım farklı problemlerden kaynaklı sanırım, biraz üzerinde çalışıp takıldığım yer olursa yeni bir başlık açarım.

Teşekkürler yardımınız için.
Kolay gelsin.

main le ilgili yanıtınızda diğer sorunu çözdü, ilk halinde tüm dosyalar aynı klasördeydi, mainde test dosyasında kaldı tabii, run dosyasına alınca düzeldi. şimdi iki kere teşekkür borçluyum, Sağolun

Rica ederim, kolay gelsin, iyi çalışmalar.

1 Beğeni

Erken sevinmişim, mesaj yazdıktan sonra farkettim ki hiç bir test dosyasını koşmuyor, biraz baktım ama çözemedim, bunun içinde yardımcı olabilir misiniz.

run dosyasına main eklersem consoleda aldığım yanıt:

>hakan@:~/AutomationTests/RE$ python run.py 

Running tests... 
----------------------------------------------------------------------

----------------------------------------------------------------------
Ran 0 tests in 0:00:00

OK



Generating HTML reports...

test fonksiyonlarının adı test ile başlıyor mu?
Eğer başlamıyor ise unittest modülü göremez fonksiyonları

Dizin ağaç yapısını ve dizinlerde yer alan python dosyalarının içeriklerini paylaşabilir misiniz?

test_ şeklinde başlıyor hepsi.

TCADDNEWP01.py dosyasının mı çalıştırılması gerekiyor?

Bu dosya, run.py dosyasına import edildiğinde nasıl bir işlem gerçekleşiyor? TestAddNewPropery01 sınıfı dışında başka bir kod var mı? Resimden çok bir şey anlaşılmıyor. Kodlarınızı şu şekilde paylaşabilirsiniz.

```
kodlar bu araya yazılacak.
```

Dosyaları ekledim.

. / topfolder / addnewproperty / TCADDNEWP01.py

import unittest
import HtmlTestRunner

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

from ..commons.unittestcase import TestRE
from ..commons.common_functions import AddProperty
from ..commons.locators import CommonPageLocators, SigninPageLocators, AddPropertyPageLocators
from ..commons import property_update_values as pv


class TestAddNewProperty01(TestRE):

    def setUp(self):
        super().setUp()
        self.add_property = AddProperty(self.driver)
        self.signout = AddProperty(self.driver)
        self.add_property.signin(SigninPageLocators.EMAIL_INPUT, SigninPageLocators.PASSWORD_INPUT, SigninPageLocators.LOGIN_BUTTON)
        self.driver.maximize_window()

    def test_add_new_property_01(self):
        self.add_property.add_property_button(AddPropertyPageLocators.ADD_PROPERTY_BUTTON)

        self.add_property.prop_name(AddPropertyPageLocators.PROPERTY_NAME, 'AddNewP01')
        self.add_property.prop_address(AddPropertyPageLocators.PROPERTY_ADDRESS, pv.address)
        self.add_property.investment_inflation(AddPropertyPageLocators.INVESTMENT_INFLATION, pv.investment_inflation_amount)
        self.add_property.investment_inflation_currency(AddPropertyPageLocators.INVESTMENT_INFLATION_CURRENCY, pv.investment_inflation_currency)
        self.add_property.repatriation_inflation(AddPropertyPageLocators.REPATRIATION_INFLATION, pv.repatriation_inflation_amount)
        self.add_property.repatriation_inflation_currency(AddPropertyPageLocators.REPATRIATION_INFLATION_CURRENCY, pv.repatriation_inflation_currency)
        self.add_property.analysis_start_date(AddPropertyPageLocators.ANALYSIS_START_DATE, pv.analysis_start_date)
        self.add_property.general_partner(AddPropertyPageLocators.GENERAL_PARTNER, pv.general_partner)
        
        self.add_property.default_rentable_space_designation(AddPropertyPageLocators.DEFAULT_RENTABLE_SPACE_DESIGNATION, pv.default_rentable_space_designation_type)
        self.add_property.identifier(AddPropertyPageLocators.IDENTIFIER)
        self.add_property.rentable(AddPropertyPageLocators.RENTABLE, pv.rentable_area)
        
        self.add_property.market_gross_rental_rate(AddPropertyPageLocators.MARKET_GROSS_RENTAL_RATE, pv.market_gross_rental_rate_amount)
        self.add_property.long_term_market_vacancy_rate(AddPropertyPageLocators.LONG_TERM_MARKET_VACANCY_RATE, pv.long_term_market_vacancy_rate_percent)
        self.add_property.overall_property_cap_rate(AddPropertyPageLocators.OVERALL_PROPERTY_CAP_RATE, pv.overall_property_cap_rate_percent)
        self.add_property.expected_inflation_rate(AddPropertyPageLocators.EXPECTED_INFLATION_RATE, pv.expected_inflation_rate_percent)
        self.add_property.landlord_discount_rate(AddPropertyPageLocators.LANDLORD_DISCOUNT_RATE, pv.landlord_discount_rate_percent)
        
        self.add_property.full_market_value(AddPropertyPageLocators.FULL_MARKET_VALUE, pv.full_market_value_amount)
        self.add_property.currency_symbols(AddPropertyPageLocators.CURRENCY_SYMBOLS, AddPropertyPageLocators.CURRENCY_SYMBOL)
        self.add_property.purchase_price(AddPropertyPageLocators.PURCHASE_PRICE, pv.purchase_price_amount)
        self.add_property.loan_to_value(AddPropertyPageLocators.LOAN_TO_VALUE, pv.loan_to_value_amount)
        self.add_property.interest_rate(AddPropertyPageLocators.INTEREST_RATE, pv.interest_rate)
        
        self.add_property.operating_expenses(AddPropertyPageLocators.OE_NONCONT_TYPE, pv.oe_noncont_type_text, AddPropertyPageLocators.OE_NONCONT_RATE, pv.oe_noncont_rate_amount, AddPropertyPageLocators.OE_NONCONT_YOY, pv.oe_noncont_yoy_percent)
        self.add_property.isCAM(AddPropertyPageLocators.OE_NONCONT_isCAM_input)
        
        self.add_property.improvements(AddPropertyPageLocators.IMPROVEMENT_TYPE, pv.improvement_type, AddPropertyPageLocators.IMPROVEMENT_COST, pv.improvement_cost)
        self.add_property.leasing_commissions(AddPropertyPageLocators.NEW_LEASE_RATE_PERCENT, pv.new_lease_rate_percent, AddPropertyPageLocators.NEW_LEASE_METHOD, AddPropertyPageLocators.NL_METHOD_NET)
        self.add_property.leasing_commissions(AddPropertyPageLocators.RENEWAL_EXTENSION_RATE_PERCENT, pv.renewal_extension_percent, AddPropertyPageLocators.RENEWAL_EXTENSION_METHOD, AddPropertyPageLocators.RE_METHOD_NET)
        self.add_property.click(AddPropertyPageLocators.SAVE_BUTTON)
        self.add_property.assert_elem_text(CommonPageLocators.HEADER_PAGE_NAME, 'Properties') # final assertion1
        self.add_property.assert_elem_text(CommonPageLocators.FINAL_FIRST_PROPERTY, 'AddNewP01') # final assertion2
        print('Final Assertion-current_url is ', self.driver.current_url)
        self.add_property.screen_shot("/home/hakan/Projects/AutomationTests/re/topfolder/screenshots/ADDNEWP-01-final_assertion.png")

. / run.py

import unittest
import HtmlTestRunner

from topfolder.addnewproperty import TCADDNEWP01

if __name__ == '__main__':
    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output='/home/hakan/Projects/AutomationTests/re/topfolder/results'))

. / topfolder / commons / common_functions.py

from .locators import CommonPageLocators, SigninPageLocators
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys


class BasePage:

    def __init__(self, driver):
        self.driver = driver

    def just_find_tag(self, by_locator):
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator)).text

    def click(self, by_locator):
        WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located(by_locator)).click()

    def tab(self, by_locator):
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator)).send_keys(Keys.TAB)

    def hover_to(self, by_locator):
        element = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator))
        ActionChains(self.driver).move_to_element(element).perform()

    def assert_elem_text(self, by_locator, elem_text):
        element = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator))
        assert element.text == elem_text

    def signout(self, by_locator):
        elem = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator))
        elem.click()

    def signin(self, by_locator1, by_locator2, by_locator3):
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator1)).send_keys('admin@abc.local')
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator2)).send_keys('abcdef1!')
        elem = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator3))
        elem.click()

    def wait_(self, tm):
        import time
        time.sleep(tm)

    def block_and_delete(self, by_locator):
        elem = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator))
        elem.send_keys(Keys.CONTROL + 'a')
        elem.send_keys(Keys.DELETE)
    
    def send_keys_(self, by_locator, text):
        elem = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator))
        elem.send_keys(Keys.CONTROL + 'a')
        elem.send_keys(Keys.DELETE)
        elem.send_keys(text)

    def add_property_button(self, by_locator):
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator)).click()
    
    def scrollTo(self, scroll):
        import time
        time.sleep(3)
        self.driver.execute_script(scroll)
        # "window.scrollTo(0,700)"

    def screen_shot(self, file_name):
        self.driver.get_screenshot_as_file(file_name)
        # "screen_shots/ADDNEWP-07-final_assertion.png"


class AddProperty(BasePage):

    def __init__(self, driver):
        super().__init__(driver)
        self.driver.get('https://def.abcdev.io/')

. / topfolder / commons / locators.py

from selenium .webdriver.common.by import By


class CommonPageLocators:
    SIGNOUT_BUTTON = (By.XPATH, '//*[@id="__next"]/div/div/div[1]/div/div[2]/div[2]/div')
    HEADER_DROP_BUTTON = (By.XPATH, '//*[@id="__next"]/div/div/div[1]/div/div[2]/div[2]/button')
    HEADER_PAGE_NAME = (By.CLASS_NAME, 'ui.inverted.header')
    FINAL_FIRST_PROPERTY = (By.XPATH, '//*[@id="__next"]/div/div/div[2]/div/div/div[2]/div/div/div[1]/div[3]/div[1]')
    UPDATABLE_PROP = (By.XPATH, '//*[@id="__next"]/div/div/div[2]/div/div/div[2]/div/div/div[1]/div[1]')
    
class SigninPageLocators:
    EMAIL_INPUT = (By.NAME, 'email')
    PASSWORD_INPUT = (By.NAME, 'password')
    LOGIN_BUTTON = (By.XPATH, '//*[@id="__next"]/div/div/form/div/button')
...
    # Save and Cancel
    SAVE_BUTTON = (By.XPATH, '//*[@id="__next"]/div/div/div[2]/div/div[2]/div[8]/div/button[2]')
    CANCEL = (By.XPATH, '//*[@id="__next"]/div/div/div[2]/div/div[2]/div[8]/div/button[1]')

. / topfolder / commons / unittestcase.py

import unittest
from selenium import webdriver

class TestRE(unittest.TestCase):

    def setUp(self):
        chrome_options = webdriver.ChromeOptions()
        # chrome_options.add_argument('headless')
        chrome_options.add_argument('window-size=1920x1080')
        self.driver = webdriver.Chrome(executable_path='/home/hakan/Projects/AutomationTests/drivers/chromedriver_linux64 (1)/chromedriver', options=chrome_options)

    def tearDown(self):
        self.driver.quit()
        self.driver.stop_client()

run.py dosyasında TCADDNEWPROP01.py dosyasını çalıştırdığımda aldığım yanıt;

>hakan@:~/AutomationTests/re$ python run.py 

Running tests... 
----------------------------------------------------------------------

----------------------------------------------------------------------
Ran 0 tests in 0:00:00

OK



Generating HTML reports...

TCADDNEWPROP01.py içerisinde ki test fonksiyonunu run etmesi gerekiyor.

Çalıştırmaması normal geldi bana çünkü TCADDNEWP01.py dosyasındaki TestAddNewProperty01 sınıfından bir örnek oluşturmamışsınız. Sadece dosyayı import ediyorsunuz başka da bir şey yapmamışsınız.

Kodlar şuna benziyor:

Aşağıdaki gibi bir dizin ağaç yapısı var:

.
├── run.py
└── topfolder
    └── addnewproperty
        └── TCADDNEWP01.py

TCADDNEWP01.py dosyasında şu kodlar yazılı:

class Test:
    def print(self, string):
        print(string)

run.py dosyasında şunlar yazılı:

from topfolder.addnewproperty import TCADDNEWP01

Bu kodları çalıştırsam bir çıktı almayız. Çünkü import edilen dosyada sadece bir sınıf tanımlanmış ve sınıftan örnek oluşturan herhangi bir kod da yok. Sınıfta yer alan bir örnek metodunu çalıştırmak için önce sınıftan örnek oluşturmam gerekiyor. Yani run.py dosyasını şu şekilde düzenlemem gerekiyor:

run.py

from topfolder.addnewproperty import TCADDNEWP01

# Test sınıfından örnek oluşturuyoruz.
test = TCADDNEWP01.Test()

# Örnek metotlarından istediğimizi çağırıyoruz.
test.print("hello")

Teşekkürler, kolay gelsin.