第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文件位于同一目录中的文件而不是从标准库导入”
谢谢您!
答案 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}}的绝对路径。)