【问题标题】:Is possible to add a python site directory permanently?是否可以永久添加 python 站点目录?
【发布时间】:2018-05-16 14:40:10
【问题描述】:

为了管理我的项目的所有 python 路径并在我启动 python 解释器后立即使用它们,我在项目主目录中创建了一个 project.pth,其中包含相对路径, 实际上,要阅读,我每次启动解释器时都需要做一个 site.addsitedir(my_project_home_dir) 。

我尝试设置 PYTHONPATH 或在指向我的项目主目录的站点包中创建一个 .pth,但是当我启动解释器时仍然不会自动读取 project.pth。

唯一可行的方法是将我的 project.pth 放入站点包中,但这样做,我必须将我的项目相对路径转换为绝对路径。

所以它有一个主 .pth 文件,我可以在其中指定我的项目主目录,以便我可以将位于该目录中的 project.pth 自动读取?

【问题讨论】:

  • 根据the documentation,将.pth 文件添加到本地lib/site-packages 目录(在Windows 上)应该可以工作。
  • 您是否正在退出 Windows(或重新启动您的 PC)以便更新您的路径文件?如果您不这样做,那么 Windows 将不会更新您的路径。
  • 我正在使用 Linux,我不想因为这样的事情重新启动我的电脑。我希望 .pth 位于我的项目目录中,而不是站点包目录中,因此我可以使用相对路径。

标签: python


【解决方案1】:

虽然我知道这并不能具体回答您的问题,但我可以建议一种不同的方法吗?使用虚拟环境 (venv)。

给定一个项目(我使用 pyscaffold)来创建。 - 创建最高级别的虚拟环境(python -m venv venv)。 - 将 PYTHONPATH 添加到您的 venv\Scripts\activate.bat 文件中。 - PYTHONPATH 应至少包含三个条目(path\to\MyTestProject;pat\to\MyTestProject\src;path\to\MyTestProject\tests)。通过“venv\Scripts\activate.bat”从 cmd 激活您的虚拟环境。 - 从您的模块中,从 src 导入 (import src.mytestproject.package1.module1)

每次激活虚拟环境时,您都可以使用自己的路径 - 并且,您将获得与虚拟环境相关的所有好处作为奖励。

MyTestProject
├── AUTHORS.rst
├── CHANGELOG.rst
├── docs
│   ├── authors.rst
│   ├── changelog.rst
│   ├── conf.py
│   ├── index.rst
│   ├── license.rst
│   ├── Makefile
│   └── _static
├── LICENSE.txt
├── README.rst
├── requirements.txt
├── setup.cfg
├── setup.py
├── src
│   └── mytestproject
│       ├── __init__.py
│       ├── package1
│       │   ├── __init__.py
│       │   └── module1.py
│       ├── package2
│       │   ├── __init__.py
│       │   └── module2.py
│       └── skeleton.py
└── tests
    ├── conftest.py
    └── test_skeleton.py

【讨论】:

  • 是的,这是个好主意。尽管如此,由于我想自动安装项目,因此自动编辑可能会随着 virtualenv 演变而更改的激活文件是危险的。此外,还有一个用于 windows 的 activate.bat 和一个用于 linux 的 activate,对于一个通用的解决方案,两者都很难维护。
  • 啊...鉴于您的声誉,我想我应该假设您了解虚拟环境。从问题中不清楚您正在进行自动安装,所以我只是假设:) 无论如何,祝你好运。
  • 只是好奇,为什么您认为修改 activate 既复杂又危险?用几行代码修改激活似乎很容易,只要将 PYTHONPATH 附加到而不是覆盖,它似乎很安全。有什么我想念的吗?
  • 手动修改很容易。但是通过安装后脚本,如果由于virtualenv改变而同时激活脚本发生了变化,它可能会遇到一些问题。我更喜欢带有路径列表的平面文件。
【解决方案2】:

最后我找到了两种方法:

1) 首先,请注意 .pth 文件也接受以 'import' 开头的行并执行它们。所以解决方案是在站点包中创建 project.pth,在我的项目主目录中导入一个模块,该模块实际上是 site.addsitedir()

2) 其他可能性:使用环境变量 PYTHONSTARTUP :它将在 python 启动时执行您想要的任何模块。您可以指定一个执行 site.addsitedir() 的模块,甚至可以直接将路径添加到 sys.path 中

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2023-04-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多