繁体   English   中英

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

[英]What's the best way to run a sequence of commend from another python file with global variables shared?

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

我试图在python中做类似的事情。 但是,即使在线阅读了这些帖子,我仍然有些困惑。

相关文章:

来自:

从另一个python脚本运行python脚本,并传入args

从另一个脚本调用一个脚本的最佳方法是什么?

subprocess.Popen和os.system之间的区别

使用子进程在python脚本中输入内容来调用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,其他一些人也提到子过程比os.system更好,但是我不确定使用子过程是否会不同地影响变量的使用? 也有人使用subprocess.Propen(),有人使用subprocess.call()。 但是我的样子,exec(open(dir +'\\ a.py')。read())似乎是我正在考虑的最接近的方法。

我应该使用哪一个,为什么会更好?

您能否在基本情况下制作“目录”或表格,我应该使用哪种类型的情况?

Python的方式是将file2.m放入模块中 ,然后将其导入到file1中。 因此,file2中的所有功能都在file1中可用。 如果file2.m包含直接执行的代码(而不是仅提供某些函数),则该代码也应被制成一个函数。

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

将来自file2.m的代码放入一个函数中确实有一个很好的副作用:它迫使您考虑该函数的合适名称 使用参数而不是全局变量将使数据依赖关系显式而不是隐式,并且正如PythonZen所说,显式比隐式更好。

from file2 import *

将使file2中的所有定义在当前文件的名称空间中可用。

每个人都说不要这样做是有充分理由的。 但这可能是您所要解决的最简单,最Python化的解决方案。

正确的方法是认真考虑当前代码需要了解的关于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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM