[英]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.py
和concurrent_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.py
和concurrent_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.