我想从位于当前目录之上的文件中的类继承。

是否可以相对导入该文件?


当前回答

import sys
sys.path.append("..") # Adds higher directory to python modules path.

其他回答

Python是一个模块化的系统

Python不依赖于文件系统

要可靠地加载python代码,请将该代码放在一个模块中,并将该模块安装在python的库中。

安装的模块总是可以使用import <name>从顶级命名空间加载


这里有一个很好的示例项目:https://github.com/pypa/sampleproject

基本上,你可以有一个这样的目录结构:

the_foo_project/
    setup.py  

    bar.py           # `import bar`
    foo/
      __init__.py    # `import foo`

      baz.py         # `import foo.baz`

      faz/           # `import foo.faz`
        __init__.py
        daz.py       # `import foo.faz.daz` ... etc.

.

确保在setup.py中声明setuptools.setup(),

官方示例:https://github.com/pypa/sampleproject/blob/master/setup.py

在我们的例子中,我们可能想要导出bar.py和foo/__init__.py,我的简单例子:

setup . py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    ...
    py_modules=['bar'],
    packages=['foo'],
    ...
    entry_points={}, 
        # Note, any changes to your setup.py, like adding to `packages`, or
        # changing `entry_points` will require the module to be reinstalled;
        # `python3 -m pip install --upgrade --editable ./the_foo_project
)

.

现在我们可以将模块安装到python库中; 使用pip,你可以在编辑模式下将_foo_project安装到python库中, 这样我们就能实时处理了

python3 -m pip install --editable=./the_foo_project

# if you get a permission error, you can always use 
# `pip ... --user` to install in your user python library

.

现在,我们可以从任何python上下文中加载共享的py_modules和包

foo_script.py

#!/usr/bin/env python3

import bar
import foo

print(dir(bar))
print(dir(foo))

为了清晰起见,下面是ThorSummoner的回答的一个三步,有点简单的版本。它不完全是我想要的(我将在底部解释),但它工作正常。

步骤1:创建目录和setup.py

filepath_to/project_name/
    setup.py

在setup.py中,这样写:

import setuptools

setuptools.setup(name='project_name')

步骤2:将该目录作为包安装

在控制台运行以下代码:

python -m pip install --editable filepath_to/project_name

而不是python,你可能需要使用python3或其他东西,这取决于你的python是如何安装的。你也可以用-e代替——editable。

现在,您的目录将或多或少像这样。我不知道鸡蛋是什么东西。

filepath_to/project_name/
    setup.py
    test_3.egg-info/
        dependency_links.txt
        PKG-INFO
        SOURCES.txt
        top_level.txt

这个文件夹被认为是一个python包,即使你在电脑的其他地方写脚本,你也可以从这个父目录中的文件导入。

步骤3。从上面输入

假设您创建了两个文件,一个在项目的主目录中,另一个在子目录中。它看起来是这样的:

filepath_to/project_name/
    top_level_file.py
    subdirectory/
        subfile.py

    setup.py          |
    test_3.egg-info/  |----- Ignore these guys
        ...           |

现在,如果top_level_file.py看起来像这样:

x = 1

然后我可以从subfile。py中导入,或者从电脑上的其他文件中导入。

# subfile.py  OR  some_other_python_file_somewhere_else.py

import random # This is a standard package that can be imported anywhere.
import top_level_file # Now, top_level_file.py works similarly.

print(top_level_file.x)

这与我正在寻找的不同:我希望python有一种单行方式从上面的文件导入。相反,我必须像对待模块一样对待脚本,执行一堆样板文件,并全局安装它,以便整个python安装都能访问它。它是多余的。如果有人有一个更简单的方法,而不涉及上述过程或重要的恶作剧,请告诉我。

运行python /myprogram/submodule/mymodule.py,导入/myprogram/mainmodule.py,例如via

from mainmodule import *

在Linux上(例如,在python Docker映像中),我必须将程序根目录添加到PYTHONPATH:

export PYTHONPATH=/myprogram

现在是2022年,没有一个答案真的对我有用。下面是最后奏效的方法

import sys
sys.path.append('../my_class')
import my_class

我的目录结构:

src ——my_class.py 笔记本电脑 ——mynotebook.ipynb

我从mynotebook.ipynb导入my_class。

import sys
sys.path.append("..") # Adds higher directory to python modules path.