24WOK 发表于 2024-5-2 18:35

pyside6调用外部代码报错 求大佬赐教

from PySide6.QtWidgets import QApplication, QWidget
from 汽车宝UI import Ui_Form
import hello_rc
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Slot
import mainCode

class MyWindow(QWidget, Ui_Form):
    def __init__(self):
      super().__init__()
      self.setupUi(self)

      # 将点击信号连接到槽函数
      self.pushButton_2.clicked.connect(self.execute_imported_code)

    # 槽函数,当 pushButton_2 被点击时执行引入的代码
    @Slot()
    def execute_imported_code(self):
      # 直接运行 mainCode 模块中的代码
      exec(open("mainCode.py", encoding='utf-8').read())

      # 或者直接在这里执行引入的代码
      print("PushButton 2 clicked, execute imported code here")


if __name__ == '__main__':
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

Traceback (most recent call last):
File "E:\PycharmPFile\XYJD\汽车之家\UI\05.py", line 20, in execute_imported_code
    exec(open("mainCode.py", encoding='utf-8').read())
File "<string>", line 385, in <module>
File "<string>", line 295, in main
NameError: name 'get_band_response' is not defined
我单独运行没问题的   在pyside6里面调用就报错,为啥呢

24WOK 发表于 2024-5-2 18:38

其实可以不调用,直接放在ui代码里   但感觉不太优雅

Cool_Breeze 发表于 2024-5-2 19:35

exec(open("mainCode.py", encoding='utf-8').read())自己用还可以

24WOK 发表于 2024-5-2 20:20

Cool_Breeze 发表于 2024-5-2 19:35
exec(open("mainCode.py", encoding='utf-8').read())自己用还可以

没懂   。。。。。。

liwind 发表于 2024-5-3 00:10

报错信息说了呀,你这个域里面没有导入包含get_band_response的模块啊。
exec来让脚本执行本通常不能成功执行相对路径的导入语句。
别这么写啊,直接写个函数不就行了,别用exec,这玩意有各种问题。

Cool_Breeze 发表于 2024-5-3 16:59

24WOK 发表于 2024-5-2 20:20
没懂   。。。。。。

exec 是Python中的一个内置函数,它用于执行字符串作为Python代码。使用exec函数时确实存在一些潜在的安全风险,因为可以执行任意的代码,包括可能破坏或绕过程序限制的代码。以下是一些可能导致的安全问题:

代码注入:

如果exec函数接收来自用户的输入(如用户输入的字符串),并且没有经过适当的处理和验证,那么恶意用户可以插入恶意代码,从而可能导致程序崩溃或执行恶意操作。
权限提升:

如果在exec中执行的代码能够访问到系统资源或执行系统命令,未经许可的代码可能会导致数据泄露、权限提升或文件系统破坏。
代码执行效率:

对于大型或复杂的代码块,exec可能会比直接运行模块或函数更慢,因为它需要每次解析和编译代码。
为了提高安全性,应该遵循以下最佳实践:

避免无限制的exec:

尽量不要在不受限制的上下文中使用exec。如果可能,尽量使用eval替代,但eval也有类似的安全风险。
输入验证和处理:

对传递给exec的字符串进行严格的字符串清理和验证,确保它只包含预期的语法和功能。
使用exec在受限范围内:

在受信任的上下文中使用exec,确保代码无法访问不希望被修改的部分。
使用模块或函数:

避免直接使用exec,尽量使用模块或函数,因为它们通常经过更严格的处理和安全检查。
安全沙箱:

如果你的应用需要执行动态代码,考虑使用安全沙箱(如使用Python的安全模块如ast.literal_eval或使用第三方库如Jinja2模板引擎)来限制代码执行的范围。
只执行已知和可信的代码:

按需运行经过验证的函数或代码片段,而不是由用户控制的字符串。
请始终牢记,Python的exec功能强大但也容易被滥用,一定要谨慎使用。
页: [1]
查看完整版本: pyside6调用外部代码报错 求大佬赐教