上下文:我正在尝试将代码从 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 生成的变量可以由 file1.py 自由读取,就像运行一系列命令一样在一个文件中,或者在 Matlab 的同一工作区中运行它。
有人提到 execfile 不能传递参数???因此最好的方法是使用 os.system,其他一些人也提到 subprocess 比 os.system 更好,但我不确定使用 subprocess 是否会对变量的使用产生不同的影响?也有人使用 subprocess.Propen(),有人使用 subprocess.call()。但从我看来, exec(open(dir+'\a.py').read()) 似乎是我对这个过程的最接近的思考方式。
我应该使用哪一个?为什么它更好?
您能否制作一个“目录”或表格,基本上明确我应该在什么类型的情况下使用哪一个?
最佳答案
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)
正如您在本文中看到的 - 纯属虚构! - 例如,相当多的功能可以间接公开为对象属性和方法。理想情况下,根本不应该有全局变量 - 也许一个类属性或单个对象实例列表将是载体,但如果没有有关代码的任何详细信息,就不可能提出任何具体建议。
关于python - 从另一个共享全局变量的 python 文件运行命令序列的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53105582/