我从python.org上阅读了文档,但仍然对此问题感到困惑。在一个项目中,我有以下脚本结构:
dir a:
math.py containing func c()
main.py containing main()
我应该在main.py中做什么才能在dir a而不是stdlib下导入数学?
导入数学只是不起作用
答案 0 :(得分:2)
修改强> 的
抱歉我的错误...这将永远不会奏效。您可以选择为顶级包提供一个与标准库中的名称不冲突的名称。或者主脚本不能在包目录中。所以基本上你可以:
将您的模块重命名为my_math.py
,然后main.py
可以位于同一目录中,您可以这样做:
from my_math import c
c()
或者您创建了一个包,例如文件夹名test
(或与标准库包冲突的任何其他名称)包含文件:__init__.py
和math.py
,以及与test
创建main.py
的级别相同,然后代码如下:
from test.math import c
c()
文件夹结构:
.
|-- test
| |-- __init__.py
| `-- math.py
`-- main.py
答案 1 :(得分:1)
这可以工作。
sys.path.insert(0,'path/to/math.py')
import math
这将在stFlibs BEFORE指定目录下进行python检查。出于同样的原因,这是一种冒险的方法。我建议将math.py放在其OWN目录中并使用该路径,这样就不会改变任何其他内容。
如果您还导入了其他模块,我还建议您导入此LAST。
import stuff
import morestuff
sys.path.insert(0,'path/to/math')
import math
同样,不推荐使用“数学”。重命名是最好的,特别是对于像“数学”这样的流行模块。
答案 2 :(得分:0)
您可以导入具有模块文件路径的确切规范的模块,并为模块提供特定名称。 看看imp模块。
以下是一个例子:
# file: math.py
def say_hello():
print "Hello!"
和主文件:
# file: main.py
import imp
my_math = imp.load_source("my_math", "math.py")
my_math.say_hello()
如果两个文件都位于当前工作目录的位置,这对我有用。
请注意,这种方法往往难以维护且不灵活。不与标准库和其他语言功能名称发生冲突通常是件好事。因此,您应该重命名该模块或将其移动到(非全局)命名空间,即子包。
供参考: