from .mod1 import stuff
来自Python文档,
在Python 2.5中,您可以使用
from __future__ import absolute_import
指令将导入的行为切换到绝对导入。在未来版本(可能是Python 2.7)中,这种绝对导入行为将成为默认值。一旦绝对导入成为默认值,import string
将始终找到标准库的版本。建议用户尽可能开始使用绝对导入,因此最好在代码中开始编写from pkg import string
。
bash$ export PYTHONPATH=/PATH/TO/APP
然后:
import sub1.func1
# ...more imports
当然,PYTHONPATH是“全局”的,但它现在还没有给我带来麻烦。
virtualenv
让您管理导入语句的方式。 - byxorimport pathlib
import sys
sys.path.append(pathlib.Path(__file__).parent.resolve())
import file_to_import # the actual intended import
与另一种解决方案不同的是,这里使用了pathlib
而不是os.path
。
PYTHONPATH
中:export PYTHONPATH="${PYTHONPATH}:/path/to/your/module/"
sys.path
大致相同,因为 sys.path
是从 PYTHONPATH
初始化的。 - Jorilsys.path
需要在源代码中硬编码,而 PYTHONPATH
是一个环境变量,可以被导出。 - Giorgos Myrianthous该方法查询并自动填充路径:
import os
import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
os.sys.path.insert(1, parentdir)
# print("currentdir = ", currentdir)
# print("parentdir=", parentdir)
真是一场激烈的辩论!
我是Python的新手(但有多年编程经验,不喜欢Perl),对于Apache设置这个黑魔法还是相对外行,但我知道我需要什么(我认为)才能让我的小实验项目在家里运行。
以下是我对情况的总结:
如果我使用-m 'module'方法,我需要:
__init__.py
文件。在CGI环境中,当我将脚本目录别名化并想要直接运行脚本作为/dirAlias/cgi_script.py时,该怎么办呢?
为什么修改 sys.path 被称为黑客行为?Python文档页面中指出:"程序可以自由地修改此列表来满足其自身目的。"如果它起作用了,那就没问题了,对吧?账户部门的会计并不关心它是如何工作的。.../py
/cgi
/build
/modules
所以我的“模块”可以从CGI世界或服务器世界导入。
我已经尝试过-m
/modules方法,但我更喜欢以下方法(并且不会混淆如何在CGI空间中运行):
在/path/to/python/Lib目录(或默认的sys.path列表中的任何其他目录)中创建XX_pathsetup.py
文件。'XX'是一些标识符,它声明了根据文件中的规则设置路径的意图。
在任何想要能够从上述目录配置的“模块”目录中导入的脚本中,只需使用import XX_pathsetup.py
即可。
这是我的非常简单的XX_pathsetup.py文件:
import sys, os
pypath = sys.path[0].rsplit(os.sep, 1)[0]
sys.path.insert(0, pypath + os.sep + 'modules')
在我看来,这不是一种“黑客”行为。这只是将一个小文件放入Python“Lib”目录中,并使用一个导入语句声明意图修改路径搜索顺序。
__init__.py
文件已经不再需要用于标记包,并且它们的目的完全不同。它们不需要为空;只是创建一个空文件比创建一个非空文件更简单。除此之外,请记住这不是一个讨论论坛,期望答案直接切入主题,不要谈论个人经验或你尝试解决的相关问题(请阅读[答案])。最后,为什么你在2023年还在直接使用CGI? - undefined