【问题标题】:Importing variables from python script into another script is throwing errors that variables are undefined将python脚本中的变量导入另一个脚本会引发变量未定义的错误
【发布时间】:2020-09-25 00:13:44
【问题描述】:

我目前正在使用带有 Python 的 WinAppDriver 为专有的 Windows 桌面应用程序编写自动化脚本。我们的应用程序让用户上传一些文件,根据上传的文件进行一些幕后计算,然后输出结果。我有使用 UI 上传这些文件的自动化,并且对此没有任何问题。这样做的过程如下:

  1. 单击“选择文件”按钮。在弹出窗口中浏览到文件位置

  2. 单击“文件名”字段并输入文件的直接路径。单击确定(这是通过 Python 键盘库完成的)

  3. 对所有必要的文件重复前面的步骤

  4. 点击“开始”

为了整理我的脚本,我将文件路径设置为变量,而不是在我的代码中使用它们的直接路径。然后我只调用我需要的文件的变量名。

例如file_to_upload_1: str = r”C:\Users\user\...\filename.txt

我创建了一个单独的filePaths.py,其中存储了所有这些设置为变量的文件路径,因此将来添加/修改它们很容易,而且都在一个地方。

我遇到的所有这些问题是当我import 这个.py 包含我的文件路径设置为变量时。现在,为了简单起见,我正在做from filePaths import *。这通常是不受欢迎的,VS Code 会向我发出警告,建议我导入了未使用的导入。我继续将变量设置为单独的类,然后尝试通过以下方式导入它们:from filePaths import dataset_1 当我这样做时,我收到以下错误:Undefined variable “variable_name” 并且我的测试无法运行。似乎只有导入所有内容才能使这一切正常工作,并且如果可能的话,我想避免这样做。我所有的脚本都在同一个目录中。我在这里错过了什么?

代码示例:

from filePaths import * <-- THIS WORKS!
# from filePaths import class_1 <-- THIS DOES NOT

#Open App
desired_caps = {}
desired_caps["app"] = "C:\\Users\\Public\\Desktop\\Application_Being_Tested.lnk"
driver = webdriver.Remote("http://127.0.0.1:4723", desired_caps)

#Login
driver.find_element_by_accessibility_id("Username").send_keys("tester")
driver.find_element_by_accessibility_id("UserPassword").send_keys("password")
driver.find_element_by_accessibility_id("btnLogin").click()

###Upload Files###

#First File To Upload
driver.find_element_by_accessibility_id("ChooseFile").click()
time.sleep(.1)
driver.find_element_by_accessibility_id("FileName").click()
keyboard.write(filePaths_variable)
keyboard.press_and_release('enter')

【问题讨论】:

  • 很可能,from filepaths.filename import class_call
  • filePaths.py 在这种情况下是实际的文件名,当我尝试导入包含一组选定变量的类时,我会出错。

标签: python visual-studio-code module automation winappdriver


【解决方案1】:

您有三个选择:

  1. 使用通配符导入所有内容(即from filePaths import *
  2. 导入选择对象(即from filePaths import object1, object2, object3 #...
  3. 使用点表示法(即import filePaths 然后filePaths.object1 #etc

有些选项可能被认为比其他选项更好。

通配符起作用的原因是,如果您在 import 语句中列出了 filePaths 中所有创建的对象,则它与上面的选项 2 相同。一般来说,您应该选择性地只导入您需要的方法和对象,或者只导入脚本并使用点表示法根据需要选择性地使用方法和对象。

以下示例代码显示了如何使用点表示法。

文件 1:

# objects_to_import.py

bob = 127
string = 'my string'

def foo():
    print('bar')

def bar():
    print('foo')

def print_var(var):
    print(var)

文件 2:

# main.py in the same directory as objects_to_import.py

import objects_to_import

print(objects_to_import.bob)
objects_to_import.print_var(objects_to_import.bob)
objects_to_import.foo()
objects_to_import.bar()

try:
    print(string)
except NameError:
    print("You didn't import that variable or use correct notation!")

然后,运行 main.py 输出:

"""
127
127
bar
foo
You didn't import that variable or use correct notation!
"""

如果 main.py 改为读取,结果是相同的:

from objects_to_import import bob, foo, bar, print_var

print(bob)
print_var(bob)
foo()
bar()

try:
    print(string)
except NameError:
    print("You didn't import that variable or use correct notation!")

请注意,如果我们将以下代码添加到两个版本的 main.py:

if('bob' in globals()):
    print('Bob is in your globals!')
else:
    print("Can't find bob in your globals")

我们发现bob 在显式导入时位于您的全局空间中,但在将点表示法与一般非显式导入语句一起使用时不存在。因此,选择一种导入方法而不是另一种可能是出于务实的原因(例如,如果您的程序又长又复杂,并且您希望更轻松地管理潜在的名称冲突,则应该使用点表示法)。

【讨论】:

  • 我尝试了from filePaths import var_1, var_2,...var_8,效果很好。我希望我可以将我的 8 个变量(应用程序在上传运行时需要 8 个单独的文件)放在一个类下并执行 from filePaths import class_1 但它不起作用。如果我打算使用from filePaths import var_1, var_2,...var_8 方法,我可能会硬着头皮做 from filePaths import * 并继续前进。也许我对代码中的警告太挑剔了?最后,我想知道为什么导入一个包含我的变量的类不起作用。
  • 有警告通知。如果您有充分的理由并且知道发出警告的原因,请务必忽略它。该警告只是让您知道您已将未使用的对象引入全局空间。污染你的全球空间不是务实的编程。当您只需要 var_1var_10 时导入 var_1var_1000 可能被认为是错误的形式。这将不必要地增加程序的资源使用量,并随着您的程序变得更长和更复杂而增加名称冲突的风险。
【解决方案2】:

好的,我想出了一个解决方案!

我有我的filePaths.py 模块,其中class_1 包含一组特定变量:分别为var_1var_2 等...

在需要这些变量的脚本中,我将模块引入如下:

import filePaths

path = filePaths.class_1

当我调用class_1 中的一个变量而不是var_1 时,我调用path.var_1 并且它没有任何问题。谢谢大家帮忙解决这个问题!

【讨论】:

  • 是的,这与我的答案中的点符号相同,您只是更深一层。无需存储在path 变量中,您只需一次调用即可编写filePaths.class_1.var_1。您将文件路径放在类中是否有特定原因(例如,它们是否具有关联的方法)?似乎将它们放在一个类中(而不仅仅是将它们作为全局变量或 filePaths.py 中的 dict 对象)混淆了整个程序。无论如何,很高兴你明白了。编码愉快!
  • 老实说,我并没有很好地遵循/理解点符号。我有点理解,但并不完全在那里。一般来说,我对编码还是很陌生,还不太了解像filePaths.class_1.var_1 这样的“链接”事物,但这些回应很有帮助。无论如何,我不能说我这样做的方式比你建议的方式有什么重大意义。再次感谢您为我提供有关如何实现目标的选择和解释。
猜你喜欢
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2017-12-07
  • 1970-01-01
  • 2018-02-08
  • 2014-01-25
  • 2023-02-21
相关资源
最近更新 更多