如何从源文件导入Python代码?
我之前有点犹豫要不要问这个问题,因为我看到过类似的问题,答案都复杂得让人看不懂。其实我想问的问题因为“模糊”和“不是一个真正的问题”而被关闭了,所以我会尽量说得具体一点。
我在一个叫“line.py”的文件里有一个对象,名字叫“line”。我想创建另一个对象,叫“line_segment”,它要继承“line”,并且放在同一个文件夹里的“line_segment.py”文件中。
path_finding_lib/
line.py
line_segment.py
a_star.py
问题是,我好像找不到办法在“line_segment.py”里使用“line.py”里的代码,而不需要去改系统的PATH变量之类的东西。
难道没有办法从文件路径导入代码或者类似的方式吗?如果没有,那是为什么呢?
4 个回答
因为这些文件在同一个文件夹里,所以你需要创建一个空文件,名字叫 __init__.py
。这样做可以让Python把你正在使用的这个文件夹当作一个“包”,这样你就可以从其他文件里提取对象和方法了。
在其他文件中使用Python代码最简单的方法就是用import语句。
比如,当你写
import xyz
Python会尝试找到文件xyz.py。它会查看以下几个地方:
- site-packages文件夹(这是你安装Python时的一个文件夹,里面有一些预装的模块,比如django等)
- PYTHONPATH环境变量中提到的位置(或者在Python中是sys.path)
- 你当前的工作目录
在你的情况下,你的程序应该包含以下这一行:
from line import line
第一行是你的line.py文件,第二行是你的类。无论你在哪里想用line对象进行继承,只需使用:
class newline(line):
关键在于你如何运行程序。如果你从path_finding_lib文件夹中运行(也就是说,当你的工作目录是path_finding_lib时,你执行
python line_segment.py
这样应该是可以的(你也可以选择在同一文件夹里创建一个空的init.py文件)。
但如果你从比如说你的主目录运行:
~$ python /path_to/path_finding_lib line_segment.py
那就不行了。这是因为Python会在site-packages、PYTHONPATH和你当前的目录中查找,但找不到line.py。为了能在任何地方运行它,在运行之前把line.py的路径添加到PYTHONPATH中。
$export PYTHONPATH=/path_to/path_finding_lib
这样你就应该能成功运行了。
注意:我假设你使用的是Linux系统。对于Windows,我不太清楚如何修改PYTHONPATH。
虽然你可以通过以下方式为特定文件添加python路径:
import sys
sys.path.append('pathtoModule')
如果它们在同一个文件夹里(不是模块,因为你没有 init.py 文件),你可以简单地通过以下方式从行模块中导入:
from line import Line
class LineSegment(line):
命名规则是:模块用下划线和小写字母,类名用大写字母: http://www.python.org/dev/peps/pep-0008/
在项目中动态地添加python路径是不标准的,可能会导致问题,因为这会在对象比较时引发错误。
如果你有一个对象是这样声明的:
path_finding_lib/
line.py
line_segment.py
a_star.py
somemodule/
afile.py
如果你的行模块从一个文件中导入并实例化一个对象,使用的路径是 somemodule.afile.SomeObject
那么它和从文件内部实例化的对象不是同一个类:
afile.SomeObject.
如果文件返回一个实例 afile.SomeObject,而这个对象与 somemodule.afile.SomeObject 的实例进行比较时,它们会被发现不相等。也就是说:
somemodule.afile.SomeObject == afile.SomeObject
==> False