我从python.org读到了文档,但仍然对这个问题感到困惑。在一个项目中,我有以下脚本结构:我应该怎么做才能导入math.py,而不是stdlib
DIR一:
math.py containing func c()
main.py containing main()
我应该在main.py为了下一个目录,而不是STDLIB导入数学吗?
进口数学是行不通的
我从python.org读到了文档,但仍然对这个问题感到困惑。在一个项目中,我有以下脚本结构:我应该怎么做才能导入math.py,而不是stdlib
DIR一:
math.py containing func c()
main.py containing main()
我应该在main.py为了下一个目录,而不是STDLIB导入数学吗?
进口数学是行不通的
编辑:
对不起我的错......这不会有任何效果。您可以选择为顶层包提供一个与标准库中的名称不冲突的名称。或者主脚本不能位于软件包目录中。所以基本上你可以:
重命名模块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
它不起作用,不幸的。 ValueError被抛出。 ValueError:试图在非包中尝试相对导入 – user2653947
向同一个目录添加一个空的'__init __。py'。这将使目录成为一个包。虽然给模块使用相同的名称并不是一个好习惯,特别是如果它们是顶级模块,那么它就是标准库中的模块。 –
也试过了,但在这里抛出相同的错误。 Windows系统在这里是否重要? – user2653947
这可以工作。
sys.path.insert(0,'path/to/math.py')
import math
这将使python在指定的目录之前检查stdlibs。出于同样的原因,这是一种有风险的方法。我建议将math.py放在其OWN目录中并使用该路径,所以没有其他更改。
如果您还有其他模块导入,我也会推荐导入这个LAST。
import stuff
import morestuff
sys.path.insert(0,'path/to/math')
import math
同样,不推荐使用“数学”。重命名是最好的,特别是对于像“数学”这样的流行模块。
您可以导入具有模块文件路径的精确规格的模块,并给模块指定一个特定名称。 看看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()
给出两个文件躺在那里当前的工作目录,这对我的作品。
请注意,这种方法往往是高度不可维护和不灵活的。不要与标准库和其他语言功能名称冲突是一件好事。因此,您应该重命名该模块或将其移动到一个(非全局)名称空间,即一个子包。
参考:
另一种选择是你的文件重命名为类似“custom_math.py”或东西,不与模块共用一个名字在stdlib中。 – SethMMorton
绝对同意@SethMMorton。你可以用“但它只适用于这个项目”这个名称来证明这个名称的正确性,但是事情有一种增长的方式,如果你刚刚学习,你想以正确的方式做事,并且包括在stdlib之后不命名模块。 – MattDMo