为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2021-08-05 10:17:40
上下文:我正在尝试将代码从 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)

正如你所看到的 - 纯属虚构!- 例如,相当多的功能可以作为对象属性和方法间接公开。理想情况下,根本不应该有全局变量——也许一个类属性或单个对象实例列表将成为载体,但是如果没有关于您的代码的任何详细信息,就不可能提出任何具体的建议。


查看完整回答
反对 回复 2021-08-05
?
温温酱

TA贡献1752条经验 获得超4个赞

Pythonic 的方法是将 file2.m 变成一个module,然后将其导入到 file1 中。因此,file2 中的所有函数都可以在file1 中使用。如果 file2.m 包含直接执行的代码(而不是仅仅提供一些函数),那么这段代码也应该被做成一个函数。

不要坚持使用 Matlab 的全局变量 ansatz。在 Python 中这是非常糟糕的形式。一旦你习惯了 Python 方式,你会发现它笨拙和不合适。

将 file2.m 中的代码放入函数有一个非常好的副作用:它迫使您为函数想一个合适的名称。使用参数代替全局变量将使数据依赖显式而不是隐式,正如Python所说,显式优于隐式。


查看完整回答
反对 回复 2021-08-05
  • 2 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信