上下文:我正在尝试将代码从 Matlab 迁移到 python。在 matlab 中,如果将两个文件放在同一个文件夹下,从其他脚本运行推荐行或函数唯一需要做的就是输入文件名。即在 file1.m 中,如果我输入 file2.m,它将自动运行 file2.m 中的所有代码行,并在同一工作空间中共享全局变量。我尝试在 python 中做类似的事情。然而,即使在阅读了网上的帖子后,我仍然有点困惑。所以我有以下选项,每个选项似乎都有其独特的优势,但帖子并没有对所有选项进行明确比较。import os.systemos.popen()subprocess.Popen()subprocess.call()execfile或者干脆exec(open(dir+'\\a.py').read())print(x) #outputs 1我需要它工作的方式是使用 let file2.py 我们在 file1.py 中相同的变量,并且 file2.py 生成的变量可以被 file1.py 自由读取,就像在一个文件中运行一系列命令一样,或者在 Matlab 的同一工作区中运行它。有人提到execfile不能传参???因此最好的方法是使用 os.system,其他一些人也提到 subprocess 比 os.system 更好,但我不确定使用 subprocess 是否会不同地影响变量的使用?还有一些人使用 subprocess.Propen() 和一些人使用 subprocess.call()。但在我看来, exec(open(dir+'\a.py').read()) 似乎是我为这个过程考虑的最接近的方式。我应该使用哪一种,为什么它更好?您能否制作一个“目录”或表格,从根本上明确我应该在什么类型的情况下使用哪个?
2 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
from file2 import *
将使file2当前文件的命名空间中的所有定义可用。
每个人都说不要那样做是有充分理由的;但这可能是您当前问题的最简单和最pythonic的解决方案。
在适当的做的方法是认真思考你目前的代码需要了解file2并提供进口只有那些东西。一种常见的封装技术是定义一个类,并且只导入该类。
from file2 import FileTwoClass
instance = FileTwoClass()
instance.frobnicate(parameterfile='./params')
for goose in instance.geese(color='green'):
flaps = instance.flaps(goose)
instance.hovercraft().eject(goose, flaps+1)
正如你所看到的 - 纯属虚构!- 例如,相当多的功能可以作为对象属性和方法间接公开。理想情况下,根本不应该有全局变量——也许一个类属性或单个对象实例列表将成为载体,但是如果没有关于您的代码的任何详细信息,就不可能提出任何具体的建议。
温温酱
TA贡献1752条经验 获得超4个赞
添加回答
举报
0/150
提交
取消