簡體   English   中英

regular.py 文件中的 ModuleNotFoundError,但在使用 pytest.py 文件運行時有效

[英]ModuleNotFoundError in regular .py files, but working when run with pytest .py files

我正在編寫並發測試,其中代碼打開兩個獨立的編劇瀏覽器並分別並發運行它們。 結構如下

MoveMouse
    |
     ----__init__.py
     ----MoveMouse.py
UnitTest
    |
     ----__init__.py
     ----TestMoveMouse
            |
             ----__init__.py
             ----test_move_mouse.py
             ----concurrent_browsers.py

test_move_mouse.pyconcurrent_browsers.py我有

import os
import sys
current = os.path.dirname(os.path.realpath(__file__))
parent = os.path.dirname(current)
sys.path.append(parent)
from MoveMouse.MoveMouse import wind_mouse as wm

從終端運行pytest test_move_mouse.py可以工作,但是當使用python concurrent_browsers.py運行時,我得到ModuleNotFoundError: No module named 'MoveMouse' 這是文件test_move_mouse.pyconcurrent_browsers.py

test_move_mouse.py:

import os
import sys
import pytest
from playwright.sync_api import Page, expect, sync_playwright

current = os.path.dirname(os.path.realpath(__file__))
parent = os.path.dirname(current)
sys.path.append(parent)
from MoveMouse.MoveMouse import wind_mouse as wm

def test_drawing_board():
    rel_path = r"/mats/drawing_board.html"
    file_path = "".join([r"file://", os.getcwd(), rel_path])
    with sync_playwright() as playwright:
        # Fetch drawing board
        browser = playwright.chromium.launch(headless=False, slow_mo=0.5)
        page = browser.new_page()
        page.mouse.move(400,50) # Place mouse in a random position in the browser before fetching the page
        page.goto(file_path)

        # Start points
        start_point = 100
        x = 1200

        # Move mouse
        page.mouse.down()
        for y in range(100, 1000, 100):
            # Generate mouse points
            points = []
            wm(start_point, y, x, y, M_0=15, D_0=12, move_mouse=lambda x, y: points.append([x, y]))

            # Draw
            page.mouse.move(start_point, y)
            page.mouse.down()
            for point in points:
                page.mouse.move(point[0], point[1])
            page.mouse.up()

concurrent_browsers.py:

import os
import sys
from concurrent.futures import ProcessPoolExecutor
from playwright.sync_api import sync_playwright

current = os.path.dirname(os.path.realpath(__file__))
parent = os.path.dirname(current)
sys.path.append(parent)
from MoveMouse.MoveMouse import wind_mouse as wm


def run_drawing_board(mouse_move, start_point):
    rel_path = r"/mats/drawing_board.html"
    file_path = "".join([r"file://", os.getcwd(), rel_path])
    with sync_playwright() as playwright:
        # Fetch drawing board
        browser = playwright.chromium.launch(headless=False, slow_mo=0.5)
        page = browser.new_page()
        page.mouse.move(400, 50)  # Place mouse in a random position in the browser before fetching the page
        page.goto(file_path)

        # Move mouse
        x = 1200
        page.mouse.down()
        for y in range(100, 1000, 100):
            # Generate mouse points
            points = []
            wm(start_point, y, x, y, M_0=15, D_0=12, move_mouse=lambda x, y: points.append([x, y]))

            # Draw
            page.mouse.move(start_point, y)
            page.mouse.down()
            for point in points:
                page.mouse.move(point[0], point[1])
            page.mouse.up()

def main():
    with ProcessPoolExecutor() as executor:
        start_points = [100, 400]
        executor.map(run_drawing_board, start_points)

if __name__ == '__main__':
        main()

兩者都具有相同的上述 MouseMove 導入並且位於同一目錄中,那么為什么它適用於test_move_mouse.py但不適用於concurrent_browsers.py

解決方案是更換

current = os.path.dirname(os.path.realpath(__file__))
parent = os.path.dirname(current)
sys.path.append(parent)

current_dir = os.getcwd().split("/")
root_idx = current_dir.index("TheProjectRootFolder")
root_dir = "/".join(current_dir[:root_idx+1])
sys.path.append(root_dir)

一切正常。 在原始代碼中,我打印出父值,發現它不是指向根文件夾TheProjectRootFolder ,而是指向上面的一個,因此對concurrent_browsers.py不起作用,但出於某種原因,可能是因為 pytest,對test_move_mouse.py 我將兩個文件的編碼改為后一種編碼,它們都有效。 希望能幫助遇到同樣問題的任何人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM