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

时间:2018-11-01 16:38:23

标签: python subprocess

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

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

相关帖子:

发件人:

Run a python script from another python script, passing in args

What is the best way to call a script from another script?

Difference between subprocess.Popen and os.system

Calling a python script with input within a python script using subprocess

因此,我有以下选择,每个选项似乎都有其独特的优势,但是帖子之间没有进行清晰的比较。

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可以自由地读取file2.py生成的变量,就像运行一系列推荐命令一样一个文件,或在Matlab的同一工作区中运行它。

有人提到execfile无法传递参数???因此最好的方法是使用os.system,其他一些人也提到子过程比os.system更好,但是我不确定使用子过程是否会不同地影响变量的使用?也有人使用subprocess.Propen(),有人使用subprocess.call()。但是我的样子,exec(open(dir +'\ a.py')。read())似乎是我正在考虑的最接近的过程。

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

您能否在某种情况下制作一张“目录”或大体上清晰的表?

2 个答案:

答案 0 :(得分:1)

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

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

将file2.m中的代码放入函数中会产生非常好的副作用:它迫使您为函数考虑一个合适的 name 。使用参数代替全局变量将使数据依赖关系显式而不是隐式,并且正如Zen of Python所说,显式比隐式好。

答案 1 :(得分:1)

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)

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