在Python中设置我的应用程序路径的正确方法
我有一个关于如何在Python(Python3.x)中正确创建路径的问题 我用Python开发了一个具有以下目录结构的小型抓取应用程序在Python中设置我的应用程序路径的正确方法,python,pythonpath,python-packaging,Python,Pythonpath,Python Packaging,我有一个关于如何在Python(Python3.x)中正确创建路径的问题 我用Python开发了一个具有以下目录结构的小型抓取应用程序 根目录 ├── Dockerfile ├── 自述文件 ├── 伊氏弓形虫 ├── src │ └── myapp │ ├── __初始值 │ ├── 做点什么 │ └── 做点别的吧 └── 测验 ├── __初始值 ├── 测试你做什么 └── 试着做点别的 当我想运行代码时,我可以转到src目录并使用 pyth
根目录
├── Dockerfile
├── 自述文件
├── 伊氏弓形虫
├── src
│ └── myapp
│ ├── __初始值
│ ├── 做点什么
│ └── 做点别的吧
└── 测验
├── __初始值
├── 测试你做什么
└── 试着做点别的
当我想运行代码时,我可以转到src目录并使用
python do_something.py
但是,因为do_something.py有一个来自do_something_else.py的import语句,所以它失败如下:
回溯(最近一次呼叫最后一次):
文件“src/myapp/do_something.py”,第1行,在
从src.myapp.do\u something\u else导入do\u it
ModuleNotFoundError:没有名为“src”的模块
因此,我最终决定使用以下命令指定python路径:
PYTHONPATH=../../python do\u something.py
以确保看到路径
但是,有什么更好的方法来提供路径,以便我的应用程序可以运行?
我想知道这一点,因为当我通过tox运行pytest时,我将运行命令tox
的目录将位于根目录,以便tox包可以看到tox.ini。如果我这样做,那么我很可能会遇到类似的问题,因为Python路径没有正确设置
我想特别问的问题是:
?或者,转到src/myapp目录,像python do_something.py一样运行
(这意味着我必须从src目录添加路径)?或者,不同的进口方式
export PYTHONPATH=:$PYTHONPATH
以使
路径可以临时访问,或者在my.bashrc中写入该行以使其永久化(但当我想通过ansible或其他自动化工具自动创建Python环境时,很难重现)
b。写入导入系统;sys.path.append()
将根目录作为可访问的路径
c。使用pytest pythonpath包(但这不是一个真正的通用答案)非常感谢您的投入 我的环境
OS:MacOS和amazonlinux2
Python版本:3.7
Python中的依赖关系:pytest、tox
我建议使用setup.py
使其成为python包。然后可以在开发模式下安装它python setup.py develope
。这样,它就可以在python环境中使用,而不需要指定PYTHONPATH
对于测试,只需安装包python setup.py install
希望有帮助 两个简单的步骤应该可以实现。Python专家可以评论这是否是一种很好的方法(特别是在本文末尾提出的结论性警告) 我会像下面那样做 首先,我会在根目录中放一个“\uuuu init\uuuuu.py”,这样层次结构如下所示。通过这种方式,python将文件夹视为一个包
根目录
├── Dockerfile
├── 自述文件
├── 伊氏弓形虫
├── __初始值
├── src
│ └── myapp
│ ├── __初始值
│ ├── 做点什么
│ └── 做点别的吧
└── 测验
├── __初始值
├── 测试你做什么
└── 试着做点别的
然后在“do_something.py”中,我会在顶部添加这些行。在第二行中,请将完整路径放入“根”目录
导入系统
sys.path+=['/home/SomeUserName/SomeFolderPath/root']
从src.myapp.do\u something\u else导入do\u it
请注意,第二行将通过添加根文件夹路径(我猜直到解释器退出)来修改sys.path。如果这不是您能负担得起的,那么我很抱歉。几乎没有好的理由修改
sys.path
或PYTHONPATH
。这是不明智的。当人们试图修改这些文件时,大多数问题都可以通过适当地打包项目以更干净的方式得到解决。如果无法进行打包,请确保当前工作目录包含顶级导入包,并相应地使用python-m…
。@sinoroc感谢您提供替代解决方案,但就修改sys.path而言,我建议查看官方文档()。下面是关于sys.path列表的说明。“程序可以出于自己的目的自由修改此列表。只有字符串和字节应添加到sys.path;导入期间将忽略所有其他数据类型。”但是,您必须在这方面有足够的经验,如果您可以指向参考或讨论,我将不胜感激。这将有助于我(和其他人)在未来。非常感谢。简言之:不要修改sys.path
,而是使要导入的代码位于sys.path
中已列出的位置之一。始终存在两个目录:站点包目录和当前工作目录。若打包正确并且项目安装正确,那个么它的顶级包可以从站点包目录导入。在某些情况下,无法进行打包或打包过度,那么python-m
允许从当前工作目录导入包。你自己试试看。没有参考资料,但有一些信息:谢谢@Amit的有趣对话。我有内华达州