根据执行路径重载python函数

时间:2015-07-01 08:09:28

标签: python

我在文件夹A中有一个main.py脚本。现在,我使用单独的文件test.py来测试结果,具体取决于测试元素。

我想在执行文件夹中使用test.py,而不是在文件夹A中使用{<1}}。

文件夹中的

main.py

def test():
  classic way to test

if __name__ == '__main__':
  prepare the test
  test()

main.py中未知的文件夹中,想要一个文件test.py

def test():
  specific test if I execute the script in this folder

我可以这样做吗?

1 个答案:

答案 0 :(得分:1)

根据您的具体要求,您可以将test()函数移动到另一个python文件,例如test.py,然后将其导入为 -

from test import test

当python试图找到test.py时,它会查询sys.path(读取PYTHONPATH)列表,其中包含python将尝试找到test.py的所有目录的列表。

现在运行脚本时,python会自动将当前目录(运行脚本的位置)作为sys.path的第一个元素附加(请注意,这不是脚本的位置,而是命令行中的位置/脚本运行的终端。)

然后是一些标准库以及PYTHONPATH中的信息。

举个例子,我在D:\\的窗口中将我的PYTHONPATH变量设置为sys.path,而D:\Python\test\shared运行我的脚本时是['D:\\Python\\test\\shared', 'C:\\Python34\\lib\\site-packages\\setuptools-17.1.1-py3.4.egg', 'C:\\Python34\\lib\\site-packages\\openpyxl-2.2.4-py3.4.egg', 'D:\\', 'C:\\windows\\system32\\python34.zip', 'C:\\Python34\\DLLs', 'C:\\Python34\\lib', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages'] -

test.py

现在,当试图找到test.py时,python将按顺序查看上面的列表(从第一个元素到最后一个元素)直到找到ImportError,如果找不到则会抛出test.py,如果发现它从它找到的第一个位置加载test.py(它不会在以后的目录中搜索,如果它已被找到一次)。

因此,在您的情况下,您可以将经典PYTHONPATH保留在某个公共位置,然后将该路径添加到test(),然后当您想要更改test.py函数的逻辑时,您可以使用包含新逻辑的test()函数在当前目录中创建main.py,并且当您在当前目录中存在test.py以来运行test.py时,加载(而不是其他PYTHONPATH

但是请注意你应该仔细处理这个,因为我看到很多人得到不同的错误,因为他们搞乱了他们的导入(有同名的多个文件),其中许多都出现在{{1}}变量