在Python中从相对路径导入

6 浏览
0 Comments

在Python中从相对路径导入

我有一个用于客户端代码的文件夹,一个用于服务器代码的文件夹,还有一个用于两者之间共享代码的文件夹。\n

Proj/
    Client/
        Client.py
    Server/
        Server.py
    Common/
        __init__.py
        Common.py

\n我该如何在Server.py和Client.py中引入Common.py?

0
0 Comments

在Python中,从相对路径导入是完全可以的!下面是我所做的一点小事情:

#首先将cwd更改为脚本路径
scriptPath = os.path.realpath(os.path.dirname(sys.argv[0]))
os.chdir(scriptPath)
#添加要导入的相对位置
sys.path.append("../common")
#导入存储在'../common'中的模块
import common.py

但是你最好知道sys.argv[0]实际上指向的是什么 - 它(很可能)不是你启动python时所在的目录。

这是一个快速的hack,有很多陷阱。但问题本身也不是最好的。

这篇文章清楚地写明了,但是Dave的回答中的原始hack更好,因为它使用__file__来获得与当前文件的正确关系

0
0 Comments

在Python中从相对路径导入的问题可能会出现的原因是,当项目的结构比较复杂时,文件之间的相对路径可能会导致导入错误。解决这个问题的方法是使用Linux命令ln来创建软链接,将共享的代码文件夹链接到各个子项目中。

具体的解决方法如下:

1. 首先进入子项目的目录,例如Proj/Client。

2. 使用ln命令创建一个软链接,将共享的代码文件夹链接到当前目录下。命令为:ln -s ../Common ./

3. 进入另一个子项目的目录,例如Proj/Server。

4. 同样使用ln命令创建一个软链接,将共享的代码文件夹链接到当前目录下。命令为:ln -s ../Common ./

现在,如果你想要在文件Proj/Client/Client.py中从文件Proj/Common/Common.py中导入some_stuff,只需按照以下方式编写代码:

# in Proj/Client/Client.py
from Common.Common import some_stuff

同样的方法也适用于Proj/Server,对于setup.py的过程也适用。希望这个方法可以帮到你!

参考链接:[点击这里查看相关讨论](https://stackoverflow.com/questions/26849832/29692096#29692096)

0
0 Comments

在Python中,从相对路径导入模块时可能会遇到一些问题。下面是出现这个问题的原因以及解决方法:

问题的原因是,Python在导入模块时会根据sys.path中的路径进行搜索,而sys.path中默认只包含当前工作目录和Python安装目录。因此,如果要从相对路径导入模块,需要将相对路径添加到sys.path中。

解决方法之一是将相对路径添加到sys.path中。可以使用以下代码将相对路径添加到sys.path中:

import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
import Common

上述代码中,`os.path.dirname(__file__)`表示当前Python文件所在的目录,然后使用`os.path.join()`函数将相对路径拼接到当前目录上,最后将拼接后的路径添加到sys.path中。

另一种解决方法是使用Python的相对导入。从Python 2.6和3.x版本开始,支持使用相对导入。相对导入可以避免使用hacky的方法,并且能确保导入的是相对路径而不是绝对路径。使用相对导入时,可以使用`..`表示上一级目录。例如:

from ..Common import Common

需要注意的是,这种方法只在以模块形式运行Python时才有效,而不是在包的外部运行。例如,可以使用以下命令以模块形式运行Python:

python -m Proj

除了上述的两种解决方法之外,还可以学习使用Python包管理工具(如distutils、setuptools等),这通常是一个必要的技能,可以解决类似的问题。

需要注意的是,手动修改Python模块的路径可能只适用于快速hack的情况,而在开发过程中,建议学习和使用Python包管理工具来解决这类问题。

虽然有很多人会提倡使用正确的技术,但是实际上使用相对导入也有一些好的原因。

如果要上级目录,可以使用额外的点来表示。例如,`from ...myfile`表示上两级目录的`myfile`模块。

如果要上级目录并进入不同目录中的文件,可以使用相对路径表示。例如,`../../mydir2/myfile`表示上两级目录的`mydir2`目录中的`myfile`文件。

0