通过另一个 python 脚本从 python 文件中检索变量值的最佳方法? [复制]

Posted

技术标签:

【中文标题】通过另一个 python 脚本从 python 文件中检索变量值的最佳方法? [复制]【英文标题】:Best way to retrieve variable values from a python file through another python script? [duplicate] 【发布时间】:2020-10-30 02:26:34 【问题描述】:

我有许多 python 文件,它们的变量名相同但值不同。像这样的东西合二为一:

var_one = 'happy'
var_two = '2345'
var_three = '-24.24'
var_four = 'Chocolate'

我需要编写一个可以读取这些文件的 Python 脚本,当我请求 var_one 时,它会返回 happy。如果我要求 var_two 它返回 2345 等等。

现在我有一个兼容 python 2 的工具箱,它使用以下内容来执行此操作:

for fname in myfile:
    d = toolbox.datafile(fname)
    my_mood = d['var_one']
    number  = d['var_two']
    decimal = d['var_three']
    candy   = d['var_four']

然后打印my_mood 将打印出happy

但是,这个工具箱不兼容 python 3,我没有做到,所以我想知道是否有一个简单的内置工具箱可以完成这项任务。

提前致谢

编辑**

导入方法似乎对回答这个问题最有帮助。我现在唯一的问题是我不知道如何导入文件。

为了进一步解释,我将解析命令行参数,其中一个参数将是我们要导入的所述文件的位置。导入它的语法是什么?

我有一个等于<home/myname/python/myfile.py>args.file

那么我将如何导入args.file

【问题讨论】:

工具箱对你来说是一个外部库吗? 以上内容看起来只是变量,你可以将这些内容保存在文本文件中。 python脚本可以直接访问它并将其保存在字典中。然后你做你想要的步骤 @subbu 怎么样?如果您有答案,请发布答案 @rajah 是的,我相信。它是由公司内部的另一个人制作的,并且非常广泛,所以我不知道他们需要多长时间才能使其符合 Python 3 标准。 @newtopython 见How to import a module given the full path? 虽然我认为alaniwi 的configparser 解决方案是一个更好的解决方案。 【参考方案1】:

你可以这样做:

vars.py

var_one = 'happy'
var_two = '2345'
var_three = '-24.24'
var_four = 'Chocolate'

main.py

import vars

# hard coded attribute lookup
print(vars.var_one)  # prints 'happy'

# to get an attribute dynamically, use getattr
name = "var_three"
print(getattr(vars, name))  # prints '-24.24'

另一个动态导入的例子:

main.py

module_name = "vars"

module = __import__(module_name)   # imports vars.py to variable 'module'

var_name = "var_three"

print(getattr(module, var_name))  # prints '-24.24'

尽管对于包含变量的文件的名称仅在运行时才知道的情况,使用 configparser 之类的名称可能更有意义:

vars.ini:

[DEFAULT]
var_one = happy
var_two = 2345
var_three = -24.24
var_four = Chocolate

main.py:

import configparser

filename = "vars.ini"
varname = "var_one"
section = "DEFAULT"

config = configparser.ConfigParser()

config.read(filename)

print(config.get(section, varname))  # prints 'happy'

【讨论】:

“动态获取属性”是什么意思?这两种方法有什么区别 @newtopython 将属性名称直接放入源代码可能并不总是很方便。在第二个示例中,您将属性的名称存储在字符串中,例如,它可能是从文件或用户输入中读取的,而不是在源代码中,您仍然可以进行查找。这为您提供了与问题示例中的字典查找相同的灵活性。 @newtopython 我现在添加了另一个示例,说明在不方便对 import vars 行进行硬编码时。 如何导入特定的文件名?我会更新我的问题,使其更具体。 @newtopython 我现在在args.file 的问题中看到了您的评论,我认为这里的__import__ 解决方案可以解决这个问题。但我还添加了另一种可能的 ini 文件供您考虑。【参考方案2】:

使用文件myfile.py,您可以:

with open('myfile.py') as file:
    exec(file.read())

变量将被分配到您的命名空间中。如果你有很多文件,你可以像这样循环:

for script in ['myfile1.py1', 'myfile2.py', 'myfile3.py']:
     with open(script) as file:
         exec(file.read())
         my_mood = var_one
         number  = var_two
         decimal = var_three
         candy   = var_four

但是您必须在循环中对这些变量进行处理,否则它们会被覆盖(或将它们保存在每个文件的某个数组中)。

但请注意generally people discourage using exec。我更喜欢import 方法,但在这种情况下可能没问题?很乐意让人们输入他们为什么鼓励或避免这种方法。

【讨论】:

【参考方案3】:

您可以使用星号表达式从文件中导入所有内容:

from filename import *

print(var_one)
print(var_two)
print(var_three)
print(var_four)

输出:

happy
2345
-24.24
Chocolate

【讨论】:

【参考方案4】:

您可以像从其他脚本中导入函数一样导入变量。

import <yourscriptfile> (Without the .py extension)
<yourscriptfile>.varname1
<yourscriptfile>.varname2

等等

【讨论】:

这类似于约书亚的回答,可能对我有用!我会试试然后回来。 别担心,顺便说一句,你也可以反过来做。假设您想为另一个脚本定义一个变量,您可以简单地执行 .varname = 不管。这个技巧有时会派上用场。 :) 这似乎是每个人都建议的相同方法,所以我可能会采用这种方法,但我编辑了我遇到的问题。【参考方案5】:

您可以使用“导入”来导入在其他脚本中定义的函数和变量。如果你有

var_one = 'happy'

在名为 myvariables.py 的文件中,您可以编写以下内容以在另一个文件中访问此变量:

from myvariables import var_one

【讨论】:

如果我只有几个变量但其中有很多变量并且我不想以这种方式导入所有变量,那就太好了。很高兴知道这一点!

以上是关于通过另一个 python 脚本从 python 文件中检索变量值的最佳方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从 php.in windows 调用 python 脚本

使用 Python 从一个文本文件复制到另一个文本文件

Python 从 python 脚本运行另一个脚本

如何从另一个 python 脚本调用和显示 PYQT UI 脚本?

在 Python 中与另一个命令行程序交互

如何执行启动另一个 python 脚本的 python 宏?