在Python中设置我的应用程序路径的正确方法

在Python中设置我的应用程序路径的正确方法,python,pythonpath,python-packaging,Python,Pythonpath,Python Packaging,我有一个关于如何在Python(Python3.x)中正确创建路径的问题 我用Python开发了一个具有以下目录结构的小型抓取应用程序 根目录 ├── Dockerfile ├── 自述文件 ├── 伊氏弓形虫 ├── src │   └── myapp │   ├── __初始值 │   ├── 做点什么 │   └── 做点别的吧 └── 测验 ├── __初始值 ├── 测试你做什么 └── 试着做点别的 当我想运行代码时,我可以转到src目录并使用 pyth

我有一个关于如何在Python(Python3.x)中正确创建路径的问题

我用Python开发了一个具有以下目录结构的小型抓取应用程序

根目录
├── 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路径没有正确设置

我想特别问的问题是:

  • 像这样创建自己的项目时,我应该在哪里运行主代码?像python src/myapp/do_something.py一样使用root
    ?或者,转到src/myapp目录,像python do_something.py一样运行
  • 一旦确定了执行程序的目录,从其他py文件导入模块的正确方法是什么?是否可以从src.myapp.do\u something\u else import do\u it使用
    (这意味着我必须从src目录添加路径)?或者,不同的进口方式
  • 有哪些方法可以让Python识别路径?我知道有几种方法可以让通行证进入,如下所示:

    a。写入
    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的有趣对话。我有内华达州