Python导入:解决当前目录和外部库之间的冲突

时间:2019-05-13 14:28:00

标签: python import

第101次这样的事情被问到了,但我仍然没有找到任何解决办法:

我有3个python文件:

main.py uses functions from math.py and site.py
site.py uses functions from math.py
math.py works independently

如果__ name __ == __ main __,则每个文件都可以包含执行的main函数,因此命令“ python3 file.py”应该能够处理“ file” = main / site / math的所有导入

第二个问题是文件名站点和数学也是标准库的名称。

此外,该程序应具有可移植性,即导入不应包含指向其他python文件的绝对路径。

需要什么导入语句?

尝试1)

所有文件都在同一目录中

main.py

import site, math

site.py

import math

问题:改为导入标准库。

尝试2)

site.py和mathtools.py(本例中对math.py的重命名)位于包含main.py的目录的子目录“ include”中

main.py

import include.site, include.mathtools

site.py

import mathtools

问题:虽然可以正常运行site.py,但是运行main.py时,“ import mathtools”语句导致一个未知模块。

尝试3)

site.py和math.py位于包含main.py的目录的“ include”子目录中

main.py

import sys, os 
sys.path.append(os.path.abspath("./include"))
import include.site, include.math

site.py

import math

问题:尽管尝试2中的问题已解决,但由于数学与标准库混淆,仍然存在冲突。

我理想的解决方案: 是否有一种简单的方式声明“从与包含此导入语句的python文件位于同一目录中的文件而不是从标准库导入”

谢谢您!

1 个答案:

答案 0 :(得分:1)

这里最简单的解决方案是不要用自定义模块遮蔽内置模块,而要使用绝对路径,但是无论如何这都可以帮助您获得更多信息:

Python将从调用它的目录中执行导入模块的功能。

例如,名为test1.py的函数位于目录tests/test1.py中的脚本test1.txt中,并且在运行时将输出名为test.py的文本文件。如果从脚本/tests/test1.txt运行,它将文本文件输出到test1.py。然后,如果将test1.txt导入根目录中的脚本并调用该函数,它将把文件输出为**Directory path for visual** ├── main.py ├── (if imported and run from main, "test1.txt" is here) ├── tests │ ├── test1.py │ ├── (if run from test1 directly, "test1.txt" is here) 到根目录。

math.py

所有导入语句的执行就像您要从主脚本中导入一样(对于上面的尝试3,意味着它将导入内置的site.py,因为include/math.py就像从根目录一样运行目录,并且没有{{1}}的绝对路径。)