我想知道,因为无论 sys.path 如何,我在将包模块导入嵌入式 python 解释器时遇到了一些大问题。
举个例子。
我的包裹。
program.py
lib|
Packz|
- __init__.py
- a.py
- b.py
program.py 导入类似
的函数from Packz.a import afunc
from Packz.b import bfunc
是否可以压平这个包以完全删除模块所在的目录并将所有lib文件放在同一目录中? (当然前提是模块名称不冲突)
program.py
lib|
Packz.py
a.py
b.py
虽然仍然保持从我的主程序导入的能力:
from Packz.a import afunc
from Packz.b import bfunc
我可以做这样的事情吗:
Packz.py>
import a
import b
对这个话题有什么想法吗?
我有一个虚拟文件系统,如果通过其目录名称引用它,则似乎在模块中加载时遇到问题。不过,主程序确实“看到”所有目录中的文件,并且我可以导入常规的单个文件模块。例如 io.py timeit.py
我尝试使用 python c api 导入我的模块,但没有成功。 我使用的是 python 2.6,所以我无法使用 import 导入带有路径的模块。 (只有2.5及以下,好像是bug)
谢谢!
我通过搜索目录中的所有模块并删除 :
的所有实例(使用“sed”或 sublime text :D )来使代码正常工作打包。
例如:
from Packz.a import afunc
becomes:
from a import afunc
and
from Packz import a
becomes:
import a
BUT
anything that is
from Packz import __version__
stays the same
-And renaming my __init__.py file to Packz.py
(只有当你的初始化文件有版本信息时才会出现这种情况,如果它是空的你可以删除它)
现在在代码中您必须直接引用模块而不是包。
如果您愿意,可以添加:
__all__ = ["afunc", "bfunc"]
from a import afunc
from b import bfunc
如果您需要它从单个独立模块一次导入所有模块,请添加到您的 Packz.py 文件。
对于那些在虚拟文件系统中遇到导入搜索功能问题的人来说,这似乎是一个不错的解决方案,尽管不是动态的。 (除了破解 python 导入函数)
这是另一个:(通过 cython 生成将模块包转换为 c,然后将模块嵌入到应用程序二进制文件中,然后您不必担心路径问题...+它使代码运行得更快)
确实,您可以通过编辑
__init__.py
来修改包行为。
在
__init__.py
内部,变量all包含您使用import *
调用的所有模块。在你的情况下,它是这样的:
__all__ = ["afunc", "bfunc"]
from a import afunc
from b import bfunc
请参阅以下主题...,可能会有所帮助;)
在C++中添加
setenv("PYTHONPATH", ".", 0);
嗯,10年后(2023年11月),但应该提到的是,还有“胶带”模块:
https://pypi.org/project/stickytape/
那个……:
[…] 可用于转换 Python 脚本和任何 Python 将其依赖的模块放入单文件 Python 脚本中。