我正在编写一个程序来帮助我为我的 pygame 项目构建矩阵。 (我使用 tkinter 作为设置窗口,然后使用 pygame 为图块着色,为它们提供 0 到 9 之间的值)
我希望可以用命名文件保存项目,以便稍后重新打开。我所需要的只是存储在 .py 保存文件中的变量值。我在创建这些保存文件时没有遇到任何问题,但是我在加载这些文件时遇到了困难。
目前我正在使用 tkinters“文件对话框”来获取文件地址,然后使用 os 模块从地址中获取文件名并将其分配给变量。
我遇到的问题是从文件导入信息,而文件名可能会有所不同,因此存储在变量中。
任何人都可以为我指明正确的方向,以便在编写代码时无需文件名即可导入吗? TIA
不是我的实际程序,只是将我试图解决的问题的最简单的示例放在一起(File2 仅包含“var = 1”)
second_file = "file2.py"
from second_file import *
print(var)
运行这个显然会给我“ModuleNotFoundError:没有名为‘second_file’的模块” 只是想知道是否有办法重写它,以便它知道它是一个变量?
如果想在Python中使用变量名导入模块,可以使用importlib模块的import_module函数。这允许您使用包含模块名称的字符串(变量)动态导入模块。您可以通过以下方式重写代码来实现此目的:
导入导入库
second_file = "file2" # 请注意,您不需要 '.py' 扩展名
模块 = importlib.import_module(第二个文件) 打印(模块.var)
importlib.import_module(second_file) 导入由 secondary_file 变量的值指定的模块。然后你可以使用 module.var 访问变量 var。
确保 secondary_file 变量包含要导入的模块名称,不带 .py 扩展名。该模块应位于与导入该模块的脚本相同的目录中,或者在 Python 路径中可用。
是的,这是可能的。 Python 提供了多种方法来实现此目的,一种常见的方法是使用 importlib 模块 https://docs.python.org/3/library/importlib.html
例如:
## file2.py
example_var = "You're in file2"
## main.py
import importlib.util
# Store the file path in a variable
second_file = 'file2.py'
# Create a module specification from the file path
spec = importlib.util.spec_from_file_location('data', second_file)
# Create a new module based on the specification
data_module = importlib.util.module_from_spec(spec)
# Execute the module (run the code in the .py file)
spec.loader.exec_module(data_module)
# Access the data from the imported module
data = data_module.example_var
print(data) # Output: You're in file2
祝你好运
只是一个想法:请学习如何创建 python 包,并了解 python 中的类,以创建更清晰的代码。此外,函数式编程在这些情况下也非常有用。可以在不使用 importlib 模块的情况下创建上述代码。