2

如果两个文件具有相同名称的函数,则在脚本中使用 source(findFile()) 导入它们并调用它会访问最后关联的文件中的函数。如何访问特定文件中的函数?python 支持 squish导入文件语法?

这是一个参考

脚本_1.py

def runner1():
    test.log("Hey")

脚本_2.py

def runner1():
    test.log("Bye")

脚本 :

source(findFile("scripts","script_1.py"))
source(findFile("scripts","script_2.py"))


runner1()//function call

O/P:再见

注意:当我使用文件名导入时,它会抛出“模块不存在”错误

4

2 回答 2

2

source()导致将指定文件中的“符号”(函数、变量)加载到 test.py 文件的命名空间/范围内。这意味着 source() 是解决此问题的错误工具。

(使用 Orip 显示的技巧,在第一个 source() 之后将函数分配给另一个符号/名称,我建议不要这样做,因为其他依赖于所需函数以初始名称可用的代码最终会调用错误的函数。 )

使用 Python 的 import 语句,您可以通过将文件视为 Python 模块来实现函数位于单独的命名空间中。为此,您必须将包含所需文件的目录路径包含到 Python 自己的“搜索路径” - sys.path中:

suite_mine/tst_testcase1/test.py 的内容:

# -*- coding: utf-8 -*-

import os.path
import sys

# Add path to our modules to the Python search path at runtime:
sys.path.append(os.path.dirname(findFile("scripts", "file1.py")))
sys.path.append(os.path.dirname(findFile("scripts", "file2.py")))

# Now import our modules:
import file1
import file2


def main():
    # Access functions in our modules:
    file1.do_it()
    file2.do_it()

suite_mine/tst_testcase1/file1.py 的内容:

# -*- coding: utf-8 -*-

import test


def do_it():
    test.log("file1.py")

suite_mine/tst_testcase1/file2.py 的内容

# -*- coding: utf-8 -*-

import test


def do_it():
    test.log("file2.py")

结果日志条目:

file1.py
file2.py
于 2017-10-13T06:53:50.330 回答
1

当您一个接一个地评估文件的内容时:

  1. source()一个定义了“runner1”函数
  2. 第二个source()用新的“runner1”函数覆盖它

根据squish 文档,您可以使用import模块。您可能需要scripts/通过在其中创建一个名为__init__.py.

然后你应该能够做到

import scripts.script_1
import scripts.script_2
scripts.script_1.runner1()
scripts.script_2.runner1()

或者

from scripts.script_1 import runner1 as foo1
from scripts.script_2 import runner1 as foo2
foo1()
foo2()

您甚至可以通过保留对第一个函数source()的新引用来继续使用。runner1不过,这很糟糕,所以import如果你能做到的话,更喜欢这个解决方案。

source(findFile("scripts","script_1.py"))
foo = runner1
source(findFile("scripts","script_2.py"))

foo()     # runs runner1 from script_1
runner1() # runs runner1 from script_2
于 2017-10-09T10:21:41.703 回答