我的项目中有两个目录:
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 包中的父目录(不在路径上)中的文件导入到子目录中的文件中?
我不太清楚 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_dir1到in_dir2.
我尝试from .. import in_dir1并from ..dir1 import in_dir1 基于此问答,但都不起作用。执行该意图的正确方法是什么?这个问答似乎包含了答案;但是,我不太确定该怎么做/如何使用PEP 366实际解决我的问题
两个__init__.py文件都是空的,我使用的是v2.6。
我试图在不使用谷歌不断出现的任何路径黑客的情况下做到这一点。
我尝试了下面两种常见的方法,但它们没有起作用 - 因此这个[看似多余的]问题。
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 项目:
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) 我们正在尝试安装几个自己编写的 python3 应用程序,共享一些版本冲突的库。
我们目前正在讨论在 PYTHONPATH 和/或 python 虚拟环境中使用包的顺序。
你会如何处理这件事?
我在加载正确版本的 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)
还是没有雪茄。有任何想法吗?
一、前言:应用程序目录结构和模块列于文末。
二、问题陈述:如果未设置 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) 我使用没有管理员权限的 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)
任何想法 ?
非常感谢
吉尔
我正在尝试自定义我的Apache Superset。我对终端不是很熟悉。
在文档中写道: “要配置您的应用程序,您需要创建一个文件(模块)superset_config.py并确保它在您的 PYTHONPATH 中。以下是您可以在该配置模块中复制/粘贴的一些参数: ”。
假设我想将 ROW_LIMIT 减少到 5000,并且我的 Superset 安装在名为“ExperimentSuperset”的 Anaconda 环境中。有人可以向我解释我必须做什么才能达到这个结果吗?
非常感谢 !
如果您从命令行(带有-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)
请注意第一个选项如何使用空字符串来表示当前工作目录,而第二个选项则明确地将路径添加到我运行命令的目录中。
根据导入系统上的文档,在执行期间始终动态解释空字符串以表示当前工作目录:
当前工作目录(由空字符串表示)的处理方式与 …
pythonpath ×10
python ×8
anaconda ×1
append ×1
dependencies ×1
import ×1
importerror ×1
macos ×1
module ×1
packaging ×1
pip ×1
python-3.6 ×1
require ×1
scripting ×1
superset ×1
sys.path ×1
terminal ×1
virtualenv ×1
windows ×1