PySimpleGui无法找到python脚本中列出的模块

bmp9r5qi  于 2023-03-31  发布在  Python
关注(0)|答案(1)|浏览(162)

我有一个由PySimpleGui创建的接口,它允许用户:

  • 为测试设置一些参数
  • 浏览到包含所有测试的文件夹
  • 启动命令以运行python脚本沿着所有参数

在当前状态下,接口可以设置参数,选择测试文件夹,并发送命令。但是,当python脚本运行时,脚本中包含的模块不会被加载。它在gui代码的venv中搜索模块,而不是在包含测试脚本的文件夹的venv中搜索模块。

import sys
import PySimpleGUI as sg
import infraLib
import glob
from serial.tools.list_ports import comports
import os
import subprocess
import pytest

infraData = infraLib.infraCommands()

def window_layout(ttTTY, vlbTTY):

    layout_01 = [
        [sg.Text('Choose TT port ', size=(30), font=('Arial', 10), justification='left')],
        [sg.Combo(ttTTY, default_value='None', key='_tt_')],
        [sg.Text('Choose VLB port ',  size=(30), font=('Arial', 10), justification='left')],
        [sg.Combo(vlbTTY, default_value='None', key='_vlb_')],
    ]

    layout_02 = [[sg.Text('Browse to Test folder'), sg.In(size=(25, 1), enable_events=True, key='_folder_'), sg.FolderBrowse()]]

    layout_03 = [
        [sg.Checkbox('Default Tests', key=('_0_'), default=False)],
        [sg.Checkbox('User Management Tests', key=('_1_'), default=False)]
    ]

    layout_04 = [
        [sg.Button("Run"), sg.Button('Exit'), sg.Button('Cancel')]
    ]

    layout = [
        [sg.T('Run tests on-demand', font='_ 14', justification='c', expand_x=True)],
        [sg.T("      ")],
        [sg.Col(layout_01, p=0, justification="left", size=(300,150))],
        [sg.Col(layout_02, p=0, justification='left')],
        [sg.Col(layout_03, p=0, justification='left')],
        [sg.Output(size=(80, 20))],
        [sg.Col(layout_04, p=0, justification='c')]
    ]
    return layout

def run_cmd(folderPath, test_cmd, tty_tt_vlb):
    os.chdir(os.path.normpath(folderPath))
    print(os.getcwd())
    tPath = os.path.normpath(folderPath)
    if sys.platform == "win32":
        tty_tt = tty_tt_vlb[0].strip('COM')
        tty_vlb = tty_tt_vlb[1].strip('COM')
        pCall = "python"
    if sys.platform == "linux":
        tty_tt = tty_tt_vlb[0]
        tty_vlb = tty_tt_vlb[1]
        pCall = "python3"

    match (test_cmd):
        case "default":
            mFlag = '"default"'
            cmdStr = pCall + ' -m pytest -vvv --tty ' + tty_tt + ',' + tty_vlb + ' -m=' + mFlag + ' ' + tPath + ' ' + optArg
        # case "factory reset":
        #     mFlag = "factory"
        case "userMgmt":
            optArg = "UserManagement"
            cmdStr = pCall + ' -m pytest -vvv --tty ' + tty_tt + ',' + tty_vlb + ' ' + tPath + ' ' + optArg

    #cmdStr = pCall + ' -m pytest -vvv --tty ' + tty_tt + ',' + tty_vlb + ' -m=' + mFlag + ' ' + tPath + ' ' + optArg
    print(cmdStr)
    sp = subprocess.Popen(cmdStr, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=None)
    out, err = sp.communicate()
    if out:
        print(out.decode("utf-8"))
    if err:
        print(err.decode("utf-8"))

ports_list = list(comports())
TTYs = []
for port in ports_list:
    TTYs.append(port.name)

temp_vlb_ports = infraData.get_vlb_ports(TTYs)
temp_tt_ports = infraData.get_tt_ports(TTYs, temp_vlb_ports)

tty_vlb_ports = []
tty_tt_ports = []

for tport in TTYs:
    for vKey, vValue in temp_vlb_ports.items():
        if vKey == tport:
            tty_vlb_ports.append(tport)
    for tKey, tValue in temp_tt_ports.items():
        if tKey == tport:
            tty_tt_ports.append(tport)

wlayout = window_layout(tty_tt_ports, tty_vlb_ports)
window = sg.Window("Run tests on-demand", wlayout, default_element_size=(25, 1), auto_size_text=False, finalize=True)

while True:
    event, values = window.read()
    # End program if user closes window or presses the Exit or Cancel button
    if event == 'Exit' or event == sg.WIN_CLOSED or event == 'Cancel':
        break
    elif values is None:
        break
    elif event == '_folder_':
        folder = values['_folder_']
        # os.chdir(values[folder])
    elif event == 'Run':
        justChecked = [element for element in values if values[element] == True]
        tt_vlb_port = values['_tt_'], values['_vlb_']
        if ('_0_') in justChecked:
            run_cmd(folder, "default", tt_vlb_port)
        if ('_1_') in justChecked:
            # run_cmd(folder, "factory", tt_vlb_port)
            run_cmd(folder, "userMgmt", tt_vlb_port)

window.close()

有什么建议可以解决这个问题吗?
谢谢,阿奇

avwztpqn

avwztpqn1#

该脚本太长,不能在我的平台上执行,所以我创建了一个新的和短的,它的工作。
注意:它调用Python来运行所选文件夹下的test.py

# D:/py/print_hello.py

def print_hello():
    print('Hello World !')
# D:/py/test.py

from print_hello import print_hello

print_hello()
# D:/Main.py

import os
import subprocess
import PySimpleGUI as sg

def run_cmd(folder):
    os.chdir(os.path.normpath(folder))
    path    = os.path.normpath(folder)
    cmdStr  = f'python {path}/test.py'
    print(cmdStr)
    sp = subprocess.Popen(cmdStr, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=None)
    out, err = sp.communicate()
    if out:
        print(out.decode("utf-8"))
    if err:
        print(err.decode("utf-8"))

layout = [
    [sg.Text('Browse to Test folder'),
     sg.In(size=(25, 1), enable_events=True, key='_folder_'),
     sg.FolderBrowse()],
    [sg.Button("Run")],
    [sg.Output(size=(80, 20))],
]
window = sg.Window("Run tests on-demand", layout)

while True:

    event, values = window.read()

    if event == sg.WIN_CLOSED:
        break
    elif event == 'Run':
        folder = values['_folder_']
        if folder:
            run_cmd(folder)

window.close()

相关问题