2013-08-05 57 views
0

我从python.org读到了文档,但仍然对这个问题感到困惑。在一个项目中,我有以下脚本结构:我应该怎么做才能导入math.py,而不是stdlib

DIR一:

math.py containing func c() 
    main.py containing main() 

我应该在main.py为了下一个目录,而不是STDLIB导入数学吗?

进口数学是行不通的

+3

另一种选择是你的文件重命名为类似“custom_math.py”或东西,不与模块共用一个名字在stdlib中。 – SethMMorton

+0

绝对同意@SethMMorton。你可以用“但它只适用于这个项目”这个名称来证明这个名称的正确性,但是事情有一种增长的方式,如果你刚刚学习,你想以正确的方式做事,并且包括在stdlib之后不命名模块。 – MattDMo

回答

2

编辑:

对不起我的错......这不会有任何效果。您可以选择为顶层包提供一个与标准库中的名称不冲突的名称。或者主脚本不能位于软件包目录中。所以基本上你可以:

重命名模块my_math.py然后main.py可以在同一目录下,你可以这样做:

from my_math import c 
c() 

或者你打个包,例如文件夹名称test(或不使用标准库包冲突的任何其他名称)与文件:__init__.pymath.py,并在同一水平test创建main.py,然后将代码如下:

from test.math import c 
c() 

文件夹结构:

. 
|-- test 
| |-- __init__.py 
| `-- math.py 
`-- main.py 
+0

它不起作用,不幸的。 ValueError被抛出。 ValueError:试图在非包中尝试相对导入 – user2653947

+0

向同一个目录添加一个空的'__init __。py'。这将使目录成为一个包。虽然给模块使用相同的名称并不是一个好习惯,特别是如果它们是顶级模块,那么它就是标准库中的模块。 –

+0

也试过了,但在这里抛出相同的错误。 Windows系统在这里是否重要? – user2653947

1

这可以工作。

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 

同样,不推荐使用“数学”。重命名是最好的,特别是对于像“数学”这样的流行模块。

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() 

给出两个文件躺在那里当前的工作目录,这对我的作品。

请注意,这种方法往往是高度不可维护和不灵活的。不要与标准库和其他语言功能名称冲突是一件好事。因此,您应该重命名该模块或将其移动到一个(非全局)名称空间,即一个子包。

参考:

相关问题