从另一个共享全局变量的python文件运行一系列推荐的最佳方法是什么?

上下文:我正在尝试将代码从 Matlab 迁移到 python。在 matlab 中,如果将两个文件放在同一个文件夹下,从其他脚本运行推荐行或函数唯一需要做的就是输入文件名。即在 file1.m 中,如果我输入 file2.m,它将自动运行 file2.m 中的所有代码行,并在同一工作空间中共享全局变量。

我尝试在 python 中做类似的事情。然而,即使在阅读了网上的帖子后,我仍然有点困惑。

所以我有以下选项,每个选项似乎都有其独特的优势,但帖子并没有对所有选项进行明确比较。


import 

os.system

os.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()) 似乎是我为这个过程考虑的最接近的方式。


我应该使用哪一种,为什么它更好?


您能否制作一个“目录”或表格,从根本上明确我应该在什么类型的情况下使用哪个?


隔江千里
浏览 281回答 2
2回答

慕沐林林

from file2 import *将使file2当前文件的命名空间中的所有定义可用。每个人都说不要那样做是有充分理由的;但这可能是您当前问题的最简单和最pythonic的解决方案。在适当的做的方法是认真思考你目前的代码需要了解file2并提供进口只有那些东西。一种常见的封装技术是定义一个类,并且只导入该类。from file2 import FileTwoClassinstance = FileTwoClass()instance.frobnicate(parameterfile='./params')for goose in instance.geese(color='green'):    flaps = instance.flaps(goose)    instance.hovercraft().eject(goose, flaps+1)正如你所看到的 - 纯属虚构!- 例如,相当多的功能可以作为对象属性和方法间接公开。理想情况下,根本不应该有全局变量——也许一个类属性或单个对象实例列表将成为载体,但是如果没有关于您的代码的任何详细信息,就不可能提出任何具体的建议。

温温酱

Pythonic 的方法是将 file2.m 变成一个module,然后将其导入到 file1 中。因此,file2 中的所有函数都可以在file1 中使用。如果 file2.m 包含直接执行的代码(而不是仅仅提供一些函数),那么这段代码也应该被做成一个函数。不要坚持使用 Matlab 的全局变量 ansatz。在 Python 中这是非常糟糕的形式。一旦你习惯了 Python 方式,你会发现它笨拙和不合适。将 file2.m 中的代码放入函数有一个非常好的副作用:它迫使您为函数想一个合适的名称。使用参数代替全局变量将使数据依赖显式而不是隐式,正如Python之禅所说,显式优于隐式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python