将python脚本中的变量导入另一个脚本会引发变量未定义的错误

2024-03-28 12:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

  4. 单击“开始”

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

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

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

我遇到的问题是,当我import这个.py包含设置为变量的文件路径时。现在,为了简单起见,我正在做from filePaths import *。这通常是不赞成的,VS代码会向我抛出警告,告知我已导入未使用的导入。我继续将变量设置为单独的类,然后尝试以以下方式导入它们: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')

Tags: 文件代码fromimport路径脚本idby
2条回答

您有三种选择:

  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在显式导入时在全局空间中,但在使用点表示法和一般非显式导入语句时不存在。因此,选择一种导入方法而不是另一种导入方法可能有一些实际原因(例如,如果您的程序较长且复杂,并且希望更轻松地管理潜在的名称冲突,则应使用点表示法)

好吧,我想出了一个解决办法

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

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

import filePaths

path = filePaths.class_1

当我调用class_1中的一个变量而不是仅仅调用var_1时,我调用了path.var_1,它没有出现任何问题。谢谢大家的帮助

相关问题 更多 >