1.更新ubuntu虚拟路径启动方式
This commit is contained in:
parent
ee7a5db41c
commit
76a6ac691d
@ -120,6 +120,39 @@ class PlatformUtils:
|
|||||||
else:
|
else:
|
||||||
return venv_path / 'bin' / 'python'
|
return venv_path / 'bin' / 'python'
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def find_venv_path(project_path: Path) -> Optional[Path]:
|
||||||
|
"""
|
||||||
|
查找项目中的虚拟环境路径
|
||||||
|
根据平台规定虚拟环境目录名称:
|
||||||
|
- Windows: .venv
|
||||||
|
- Ubuntu/Linux: venv
|
||||||
|
- macOS: venv
|
||||||
|
"""
|
||||||
|
system = PlatformUtils.get_system_type()
|
||||||
|
|
||||||
|
# 根据平台确定虚拟环境目录名
|
||||||
|
if system == 'windows':
|
||||||
|
venv_name = '.venv'
|
||||||
|
else: # Linux, macOS等
|
||||||
|
venv_name = 'venv'
|
||||||
|
|
||||||
|
venv_path = project_path / venv_name
|
||||||
|
|
||||||
|
# 检查虚拟环境是否存在
|
||||||
|
if venv_path.exists() and venv_path.is_dir():
|
||||||
|
# 验证是否是有效的虚拟环境目录
|
||||||
|
python_exec = PlatformUtils.get_python_executable(venv_path)
|
||||||
|
if python_exec.exists():
|
||||||
|
print(f"找到虚拟环境: {venv_path}")
|
||||||
|
return venv_path
|
||||||
|
else:
|
||||||
|
print(f"虚拟环境目录存在但无效(缺少Python解释器): {venv_path}")
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
print(f"虚拟环境不存在: {venv_path} (平台: {system})")
|
||||||
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_pycharm_paths() -> List[Path]:
|
def get_pycharm_paths() -> List[Path]:
|
||||||
"""获取各平台PyCharm可能的安装路径"""
|
"""获取各平台PyCharm可能的安装路径"""
|
||||||
@ -874,19 +907,28 @@ if __name__ == "__main__":
|
|||||||
# 构建命令
|
# 构建命令
|
||||||
cmd = [str(python_executable), str(script_path_obj)]
|
cmd = [str(python_executable), str(script_path_obj)]
|
||||||
if args:
|
if args:
|
||||||
print("参数:", args)
|
# 将所有参数转换为字符串,处理 Path 对象
|
||||||
cmd.extend(args)
|
str_args = [str(arg) for arg in args]
|
||||||
|
print("参数:", str_args)
|
||||||
|
cmd.extend(str_args)
|
||||||
|
|
||||||
# 设置环境变量
|
# 设置环境变量
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
env['VIRTUAL_ENV'] = str(venv_path_obj)
|
env['VIRTUAL_ENV'] = str(venv_path_obj)
|
||||||
|
|
||||||
|
# 强制子进程使用 UTF-8 编码,避免 emoji 和特殊字符编码错误
|
||||||
|
env['PYTHONIOENCODING'] = 'utf-8'
|
||||||
|
|
||||||
system = PlatformUtils.get_system_type()
|
system = PlatformUtils.get_system_type()
|
||||||
if system == 'windows':
|
if system == 'windows':
|
||||||
env['PATH'] = str(venv_path_obj / 'Scripts') + os.pathsep + env['PATH']
|
env['PATH'] = str(venv_path_obj / 'Scripts') + os.pathsep + env['PATH']
|
||||||
else:
|
else:
|
||||||
env['PATH'] = str(venv_path_obj / 'bin') + os.pathsep + env['PATH']
|
env['PATH'] = str(venv_path_obj / 'bin') + os.pathsep + env['PATH']
|
||||||
|
|
||||||
|
# 根据平台确定编码
|
||||||
|
# 注意:子进程会使用 UTF-8(通过 PYTHONIOENCODING),这里用于读取子进程输出
|
||||||
|
encoding = 'utf-8' # 统一使用 UTF-8
|
||||||
|
|
||||||
# 执行命令
|
# 执行命令
|
||||||
process = subprocess.Popen(
|
process = subprocess.Popen(
|
||||||
cmd,
|
cmd,
|
||||||
@ -894,7 +936,8 @@ if __name__ == "__main__":
|
|||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.PIPE,
|
stderr=subprocess.PIPE,
|
||||||
text=True,
|
text=True,
|
||||||
encoding='utf-8',
|
encoding=encoding,
|
||||||
|
errors='replace', # 遇到无法解码的字符时用替换字符代替,避免崩溃
|
||||||
env=env
|
env=env
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -914,16 +957,18 @@ if __name__ == "__main__":
|
|||||||
print(f"No entry point found for project: {project_path_obj}")
|
print(f"No entry point found for project: {project_path_obj}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
venv_path = project_path_obj / ".venv"
|
# 使用跨平台的虚拟环境查找方法
|
||||||
|
venv_path = PlatformUtils.find_venv_path(project_path_obj)
|
||||||
|
if not venv_path:
|
||||||
|
print(f"错误: 未找到虚拟环境")
|
||||||
|
return False
|
||||||
|
|
||||||
print(f"虚拟环境路径: {venv_path}")
|
print(f"虚拟环境路径: {venv_path}")
|
||||||
print(f"脚本路径: {entry_point}")
|
print(f"脚本路径: {entry_point}")
|
||||||
|
|
||||||
if not venv_path.exists():
|
|
||||||
print(f"错误: 虚拟环境路径不存在: {venv_path}")
|
|
||||||
|
|
||||||
if not entry_point.exists():
|
if not entry_point.exists():
|
||||||
print(f"错误: 脚本文件不存在: {entry_point}")
|
print(f"错误: 脚本文件不存在: {entry_point}")
|
||||||
|
return False
|
||||||
|
|
||||||
print(f'target_project_path:{target_project_path}')
|
print(f'target_project_path:{target_project_path}')
|
||||||
process, stdout, stderr = self.run_python_in_venv(str(venv_path), str(entry_point), [target_project_path])
|
process, stdout, stderr = self.run_python_in_venv(str(venv_path), str(entry_point), [target_project_path])
|
||||||
@ -1175,10 +1220,15 @@ if __name__ == "__main__":
|
|||||||
def check_pycharm_responsive(self):
|
def check_pycharm_responsive(self):
|
||||||
"""检查PyCharm是否响应命令"""
|
"""检查PyCharm是否响应命令"""
|
||||||
try:
|
try:
|
||||||
|
system = PlatformUtils.get_system_type()
|
||||||
|
encoding = 'gbk' if system == 'windows' else 'utf-8'
|
||||||
|
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
["pycharm", "--version"],
|
["pycharm", "--version"],
|
||||||
capture_output=True,
|
capture_output=True,
|
||||||
text=True,
|
text=True,
|
||||||
|
encoding=encoding,
|
||||||
|
errors='replace',
|
||||||
timeout=5
|
timeout=5
|
||||||
)
|
)
|
||||||
if result.returncode == 0:
|
if result.returncode == 0:
|
||||||
@ -1236,7 +1286,10 @@ if __name__ == "__main__":
|
|||||||
try:
|
try:
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
['osascript', '-e', 'tell application "System Events" to count windows of process "PyCharm"'],
|
['osascript', '-e', 'tell application "System Events" to count windows of process "PyCharm"'],
|
||||||
capture_output=True, text=True
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
encoding='utf-8',
|
||||||
|
errors='replace'
|
||||||
)
|
)
|
||||||
if result.returncode == 0 and result.stdout.strip().isdigit():
|
if result.returncode == 0 and result.stdout.strip().isdigit():
|
||||||
window_count = int(result.stdout.strip())
|
window_count = int(result.stdout.strip())
|
||||||
@ -1250,7 +1303,10 @@ if __name__ == "__main__":
|
|||||||
try:
|
try:
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
['xdotool', 'search', '--name', 'PyCharm'],
|
['xdotool', 'search', '--name', 'PyCharm'],
|
||||||
capture_output=True, text=True
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
encoding='utf-8',
|
||||||
|
errors='replace'
|
||||||
)
|
)
|
||||||
if result.returncode == 0 and result.stdout.strip():
|
if result.returncode == 0 and result.stdout.strip():
|
||||||
return True
|
return True
|
||||||
|
|||||||
@ -13,10 +13,10 @@ from PyQt5.QtCore import *
|
|||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
|
|
||||||
# 导入自定义组件
|
# 导入自定义组件
|
||||||
from MetaCore.ui.main_window import MainWindow
|
from ui.main_window import MainWindow
|
||||||
from MetaCore.ui.styles import StyleSheet
|
from ui.styles import StyleSheet
|
||||||
|
|
||||||
from MetaCore.data.project_manager import ProjectManager
|
from data.project_manager import ProjectManager
|
||||||
|
|
||||||
class MetaCoreApp(QApplication):
|
class MetaCoreApp(QApplication):
|
||||||
"""MetaCore应用程序主类"""
|
"""MetaCore应用程序主类"""
|
||||||
@ -54,11 +54,12 @@ class MetaCoreApp(QApplication):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""主函数"""
|
"""主函数"""
|
||||||
app = MetaCoreApp(sys.argv)
|
# 设置高DPI支持(必须在创建 QApplication 之前设置)
|
||||||
|
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
|
||||||
|
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
|
||||||
|
|
||||||
# 设置高DPI支持
|
# 创建应用程序
|
||||||
app.setAttribute(Qt.AA_EnableHighDpiScaling, True)
|
app = MetaCoreApp(sys.argv)
|
||||||
app.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
|
|
||||||
|
|
||||||
# 运行应用程序
|
# 运行应用程序
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
||||||
|
|||||||
@ -9,7 +9,7 @@ from PyQt5.QtWidgets import *
|
|||||||
from PyQt5.QtCore import *
|
from PyQt5.QtCore import *
|
||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
|
|
||||||
from MetaCore.data.project_manager import ProjectManager
|
from data.project_manager import ProjectManager
|
||||||
|
|
||||||
class CreateProjectDialog(QDialog):
|
class CreateProjectDialog(QDialog):
|
||||||
"""创建项目对话框"""
|
"""创建项目对话框"""
|
||||||
|
|||||||
@ -9,7 +9,7 @@ from PyQt5.QtWidgets import *
|
|||||||
from PyQt5.QtCore import *
|
from PyQt5.QtCore import *
|
||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
|
|
||||||
from MetaCore.data.project_manager import ProjectManager
|
from data.project_manager import ProjectManager
|
||||||
|
|
||||||
class ImportProjectDialog(QDialog):
|
class ImportProjectDialog(QDialog):
|
||||||
"""导入项目对话框"""
|
"""导入项目对话框"""
|
||||||
|
|||||||
@ -8,13 +8,13 @@ from PyQt5.QtWidgets import *
|
|||||||
from PyQt5.QtCore import *
|
from PyQt5.QtCore import *
|
||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
|
|
||||||
from MetaCore.ui.sidebar import Sidebar
|
from ui.sidebar import Sidebar
|
||||||
from MetaCore.ui.project_area import ProjectArea
|
from ui.project_area import ProjectArea
|
||||||
from MetaCore.ui.create_project_dialog import CreateProjectDialog
|
from ui.create_project_dialog import CreateProjectDialog
|
||||||
from MetaCore.ui.import_project_dialog import ImportProjectDialog
|
from ui.import_project_dialog import ImportProjectDialog
|
||||||
from MetaCore.ui.project_settings_page import ProjectSettingsPage
|
from ui.project_settings_page import ProjectSettingsPage
|
||||||
from MetaCore.data.project_manager import ProjectManager
|
from data.project_manager import ProjectManager
|
||||||
from MetaCore.ui.icon_manager import IconManager
|
from ui.icon_manager import IconManager
|
||||||
|
|
||||||
class MainWindow(QMainWindow):
|
class MainWindow(QMainWindow):
|
||||||
"""主窗口类"""
|
"""主窗口类"""
|
||||||
|
|||||||
@ -9,9 +9,9 @@ from PyQt5.QtCore import *
|
|||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from MetaCore.data.project_manager import ProjectManager, Project
|
from data.project_manager import ProjectManager, Project
|
||||||
from MetaCore.ui.icon_manager import IconManager
|
from ui.icon_manager import IconManager
|
||||||
from MetaCore.ui.project_card import ProjectCard
|
from ui.project_card import ProjectCard
|
||||||
|
|
||||||
class ProjectArea(QWidget):
|
class ProjectArea(QWidget):
|
||||||
"""项目区域组件"""
|
"""项目区域组件"""
|
||||||
|
|||||||
@ -13,9 +13,9 @@ from PyQt5.QtWidgets import *
|
|||||||
from PyQt5.QtCore import *
|
from PyQt5.QtCore import *
|
||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
|
|
||||||
from MetaCore.data.project_manager import ProjectManager, Project
|
from data.project_manager import ProjectManager, Project
|
||||||
from MetaCore.ui.icon_manager import IconManager
|
from ui.icon_manager import IconManager
|
||||||
from MetaCore.ui.project_settings_page import ProjectSettingsPage
|
from ui.project_settings_page import ProjectSettingsPage
|
||||||
class ImageDisplayWidget(QWidget):
|
class ImageDisplayWidget(QWidget):
|
||||||
"""
|
"""
|
||||||
一个专门用于显示带圆角图片的控件。
|
一个专门用于显示带圆角图片的控件。
|
||||||
|
|||||||
@ -8,8 +8,8 @@ from PyQt5.QtWidgets import *
|
|||||||
from PyQt5.QtCore import *
|
from PyQt5.QtCore import *
|
||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
|
|
||||||
from MetaCore.data.project_manager import ProjectManager
|
from data.project_manager import ProjectManager
|
||||||
from MetaCore.ui.icon_manager import IconManager
|
from ui.icon_manager import IconManager
|
||||||
|
|
||||||
class Sidebar(QWidget):
|
class Sidebar(QWidget):
|
||||||
"""侧边栏组件"""
|
"""侧边栏组件"""
|
||||||
|
|||||||
@ -1,57 +1,13 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 6,
|
||||||
"title": "智慧工厂",
|
"title": "XNWX",
|
||||||
"date": "2024-06-08 15:56:35",
|
"date": "2025-10-11 12:15:15",
|
||||||
"type": "industrial",
|
"type": "imported",
|
||||||
"image": "🏭",
|
"image": "C:\\Users\\29381\\Desktop\\XNWX\\XNWX.png",
|
||||||
"path": "",
|
"path": "C:\\Users\\29381\\Desktop",
|
||||||
"project_dir": "",
|
"project_dir": "C:\\Users\\29381\\Desktop\\XNWX",
|
||||||
"description": "",
|
"description": "从文件夹 XNWX 导入",
|
||||||
"status": "normal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 2,
|
|
||||||
"title": "智慧水务",
|
|
||||||
"date": "2023-01-10 12:09:04",
|
|
||||||
"type": "smart",
|
|
||||||
"image": "💧",
|
|
||||||
"path": "",
|
|
||||||
"project_dir": "",
|
|
||||||
"description": "",
|
|
||||||
"status": "normal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 3,
|
|
||||||
"title": "数字工厂",
|
|
||||||
"date": "2024-06-07 06:57:46",
|
|
||||||
"type": "industrial",
|
|
||||||
"image": "🏗️",
|
|
||||||
"path": "",
|
|
||||||
"project_dir": "",
|
|
||||||
"description": "",
|
|
||||||
"status": "normal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 4,
|
|
||||||
"title": "智慧监控",
|
|
||||||
"date": "2024-07-28 17:38:02",
|
|
||||||
"type": "smart",
|
|
||||||
"image": "📊",
|
|
||||||
"path": "",
|
|
||||||
"project_dir": "",
|
|
||||||
"description": "",
|
|
||||||
"status": "normal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 5,
|
|
||||||
"title": "工业设计平台",
|
|
||||||
"date": "2025-02-28 18:00:05",
|
|
||||||
"type": "design",
|
|
||||||
"image": "🎨",
|
|
||||||
"path": "",
|
|
||||||
"project_dir": "",
|
|
||||||
"description": "",
|
|
||||||
"status": "normal"
|
"status": "normal"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
Loading…
Reference in New Issue
Block a user