如何从源文件导入Python代码?

2 投票
4 回答
2921 浏览
提问于 2025-04-17 08:53

我之前有点犹豫要不要问这个问题,因为我看到过类似的问题,答案都复杂得让人看不懂。其实我想问的问题因为“模糊”和“不是一个真正的问题”而被关闭了,所以我会尽量说得具体一点。

我在一个叫“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 个回答

0

因为这些文件在同一个文件夹里,所以你需要创建一个空文件,名字叫 __init__.py。这样做可以让Python把你正在使用的这个文件夹当作一个“包”,这样你就可以从其他文件里提取对象和方法了。

1

在其他文件中使用Python代码最简单的方法就是用import语句。

比如,当你写

import xyz 

Python会尝试找到文件xyz.py。它会查看以下几个地方:

  1. site-packages文件夹(这是你安装Python时的一个文件夹,里面有一些预装的模块,比如django等)
  2. PYTHONPATH环境变量中提到的位置(或者在Python中是sys.path)
  3. 你当前的工作目录

在你的情况下,你的程序应该包含以下这一行:

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。

4

虽然你可以通过以下方式为特定文件添加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

撰写回答