标签: pythonpath

自动调用常用初始化代码,无需创建__init__.py文件

我的项目中有两个目录:

project/
  src/
  scripts/
Run Code Online (Sandbox Code Playgroud)

“src”包含我精心编写的代码,“scripts”包含一次性的 Python 脚本。

我希望所有脚本都将“../src”添加到其 sys.path 中,以便它们可以访问“src”树下的模块。一种方法是编写一个 script/__init__.py 文件,其内容为:

scripts/__init__.py:
  import sys
  sys.path.append("../src")
Run Code Online (Sandbox Code Playgroud)

这可行,但会产生不必要的副作用,即将我的所有脚本放入名为“scripts”的包中。还有其他方法可以让我的所有脚本自动调用上述初始化代码吗?

我可以只编辑 .bashrc 中的 PYTHONPATH 环境变量,但我希望我的脚本能够开箱即用,而不需要用户摆弄 PYTHONPATH。另外,我不喜欢仅仅为了适应这个项目而进行整个帐户范围的更改。

python scripting python-module pythonpath

5
推荐指数
1
解决办法
4542
查看次数

Python 相对导入在包内而不是在路径上

如何将 python 包中的父目录(不在路径上)中的文件导入到子目录中的文件中?

我不太清楚 python 打包的词汇,所以举个例子:

dir1/
    __init__.py
    runner.py
    in_dir1.py
    dir2/
        __init__.py
        in_dir2.py
Run Code Online (Sandbox Code Playgroud)

dir1/in_dir1.py:

def example():
    print "Hello from dir1/in_dir1.example()"
Run Code Online (Sandbox Code Playgroud)

dir1/dir2/in_dir2.py

import in_dir1   #or whatever this should be to make this work
print "Inside in_dir2.py, calling in_dir1.example()"
print in_dir1.example()
Run Code Online (Sandbox Code Playgroud)

鉴于它dir1不在 python 路径上,我正在寻找导入in_dir1in_dir2.

我尝试from .. import in_dir1from ..dir1 import in_dir1 基于此问答,但都不起作用。执行该意图的正确方法是什么?这个问答似乎包含了答案;但是,我不太确定该怎么做/如何使用PEP 366实际解决我的问题

两个__init__.py文件都是空的,我使用的是v2.6

我试图在不使用谷歌不断出现的任何路径黑客的情况下做到这一点。

python packaging pythonpath

5
推荐指数
1
解决办法
1918
查看次数

如何将目录永久附加到 PYTHONPATH?

我尝试了下面两种常见的方法,但它们没有起作用 - 因此这个[看似多余的]问题。

import sys
sys.path.append('foo/bar')
Run Code Online (Sandbox Code Playgroud)

export PYTHONPATH=$PYTHONPATH:foo/bar
Run Code Online (Sandbox Code Playgroud)

一旦解释器退出,第一个就会终止附加。当终端关闭时,第二个终止(尽管人们似乎对通过第二种方法永久附加没有问题)。

我在这里缺少什么以及如何解决这个问题?

谢谢。

python append pythonpath

5
推荐指数
1
解决办法
1万
查看次数

为什么带有尾随冒号的 PYTHONPATH 将当前目录添加到 sys.path?

考虑这样一个 Python 项目:

foo/
    __init__.py
scripts/
    run.py
demo.sh
Run Code Online (Sandbox Code Playgroud)

在正常情况下,foo如果您从项目的根目录运行脚本,则尝试从包导入将失败,因为默认的 Python 行为是将调用 Python 解释器的脚本目录 (不一定是当前目录)添加到sys.path. (文档):

python scripts/run.py
Run Code Online (Sandbox Code Playgroud)

然而,我最近注意到这样的导入在我的盒子上工作,我追踪到一些与 PYTHONPATH 相关的令人惊讶的行为。在我的 Bash 配置文件中,我向 PYTHONPATH 添加了一个目录:

export PYTHONPATH="/some/path:$PYTHONPATH"
Run Code Online (Sandbox Code Playgroud)

如果 PYTHONPATH 最初是空的,那么(有点草率,但常见)形式的命令将留下一个尾随冒号:

echo $PYTHONPATH
/some/path:
Run Code Online (Sandbox Code Playgroud)

我一直认为这个尾随标点符号没有影响,但尾随冒号似乎是神秘成功导入的原因。前导或尾随冒号(或甚至一个定义但空PYTHONPATH)将导致sys.path含有一个空字符串之前site 模块加载,这反过来又导致在当前工作目录被添加到sys.path

这里有一个 Python 脚本和一个 Bash 脚本来演示。我使用 Python 2.7 和 Python 3.3 得到了相同的行为。

Python脚本run.py::

import sys, os

pp = os.environ.get('PYTHONPATH')

try:
    import foo
    print 'OK'
    assert os.getcwd() in sys.path
    assert pp == …
Run Code Online (Sandbox Code Playgroud)

python import pythonpath sys.path

5
推荐指数
1
解决办法
1552
查看次数

具有冲突依赖关系的 Python 包

我们正在尝试安装几个自己编写的 python3 应用程序,共享一些版本冲突的库。

我们目前正在讨论在 PYTHONPATH 和/或 python 虚拟环境中使用包的顺序。

你会如何处理这件事?

python dependencies pip virtualenv pythonpath

5
推荐指数
2
解决办法
8468
查看次数

Python 模块 pkg_resources.require()

我在加载正确版本的 python 模块时遇到问题。我没有管理员权限,因此安装在$PYTHONHOME和下的内容$PYTHONPATH是只读的。不幸的是,驻留在其中的模块版本错误。我在如何加载正确的版本/some/other/directory 而不是在 下安装的版本中有正确的版本$PYTHONHOME?我试过 :

import sys
import pkg_resources
sys.path.insert(0, '/some/other/directory/pysam')
pkg_resources.require("pysam=0.9.1.4")
import pysam
version = pkg_resources.get_distribution("pysam").version
print('version= ', version)
Run Code Online (Sandbox Code Playgroud)

我希望获得 0.9.1.4 版本,但我没有。我仍然得到安装在$PYTHONPATH. 在运行脚本之前我也尝试过:

export PYTHONPATH=/some/other/directory:$PYTHONPATH
Run Code Online (Sandbox Code Playgroud)

还是没有雪茄。有任何想法吗?

python module require pythonpath

5
推荐指数
0
解决办法
3271
查看次数

Python 运行 Unittest 作为包导入错误

一、前言:应用程序目录结构和模块列于文末。

二、问题陈述:如果未设置 PYTHONPATH,则应用程序运行,但单元测试失败并显示ImportError: No module named models.transactions。尝试在 app.py 中导入交易时会发生这种情况。如果 PYTHONPATH 设置为/sandbox/appapplication 和 unittest 运行没有错误。解决方案的约束是不必设置 PYTHONPATH,并且不必以编程方式修改 sys.path。

三、详细信息:考虑设置 PYTHONPATH 并test_app.py作为包运行的情况/sandbox$ python -m unittest tests.test_app。查看__main__ 整个代码中喷洒的打印语句:

 models   :  app.models.transactions
 models   :  models.transactions
 resources:  app.resources.transactions
 app      :  app.app
 test     :  tests.test_app
Run Code Online (Sandbox Code Playgroud)

unittest 首先导入应用程序,因此有app.models.transactions. 应用程序尝试的下一个导入是resources.transactions. 当它被导入时,它会自己导入models.transactions,然后我们看到__name__for app.resources.transactions。接下来是app.app 导入,最后是 unittest 模块tests.test.app。设置 PYTHONPATH 允许应用程序解析 models.transactions!

一个解决办法是把models.transactions里面resources.transaction。但是有没有另一种方法来处理这个问题?

为完整起见,当应用程序运行时,打印语句为__main__

 models   : …
Run Code Online (Sandbox Code Playgroud)

python python-import importerror pythonpath python-unittest

5
推荐指数
1
解决办法
4092
查看次数

Windows 上的 python3 忽略 PYTHONPATH

我使用没有管理员权限的 Windows 7,我想使用 python3。即使我设置了 PYTHONPATH,环境变量也会被忽略。但是 PYTHONPATH 在打印时有效。

>>> print(sys.path)
['c:\\Python365\\python36.zip', 'c:\\Python365']
>>> print(os.environ["PYTHONPATH"])
d:\libs
Run Code Online (Sandbox Code Playgroud)

任何想法 ?

非常感谢

吉尔

windows pythonpath python-3.6

5
推荐指数
1
解决办法
1497
查看次数

Apache Superset config.py 上

我正在尝试自定义我的Apache Superset。我对终端不是很熟悉。

文档中写道: “要配置您的应用程序,您需要创建一个文件(模块)superset_config.py并确保它在您的 PYTHONPATH 中。以下是您可以在该配置模块中复制/粘贴的一些参数: ”

假设我想将 ROW_LIMIT 减少到 5000,并且我的 Superset 安装在名为“ExperimentSuperset”的 Anaconda 环境中。有人可以向我解释我必须做什么才能达到这个结果吗?

非常感谢 !

macos terminal pythonpath superset anaconda

5
推荐指数
2
解决办法
4501
查看次数

将工作目录添加到 sys.path 的方式在使用 `-c` 或 `-m` 之间有所不同

如果您从命令行(带有-c标志)或通过指定模块路径(带有-m标志)作为单个命令启动 Python 进程,则工作目录将附加到sys.path. 从文档(强调我的):

  • -c <命令>

    [...]

    如果给出这个选项,第一个元素sys.argvwill"-c"当前目录将被添加到开头sys.path(允许该目录中的模块作为顶级模块导入)。

    [...]

  • -m <模块名称>

    [...]

    如果给出此选项,则 的第一个元素sys.argv将是模块文件的完整路径(在定位模块文件时,第一个元素将设置为"-m")。与 -c选项一样, 当前目录将被添加到 sys.path.

    [...]

但似乎每个选项的完成方式都不同:

$ python -c "import sys; print sys.path"
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/plammens/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']

$ python -m script  # script.py does the same as the command above
['/mnt/c/Users/Paolo/Desktop/Code Sandbox/Python/clean', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/plammens/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
Run Code Online (Sandbox Code Playgroud)

请注意第一个选项如何使用空字符串来表示当前工作目录,而第二个选项则明确地将路径添加到我运行命令的目录中。

根据导入系统上的文档,在执行期间始终动态解释空字符串以表示当前工作目录:

当前工作目录(由空字符串表示)的处理方式与 …

python python-import pythonpath language-lawyer

5
推荐指数
0
解决办法
139
查看次数