是否可以完全扁平化Python包,完全删除目录?

问题描述 投票:0回答:4

我想知道,因为无论 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)

谢谢!

python c++ python-2.6 python-c-api
4个回答
2
投票

我通过搜索目录中的所有模块并删除 :

的所有实例(使用“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,然后将模块嵌入到应用程序二进制文件中,然后您不必担心路径问题...+它使代码运行得更快)

http://mdqinc.com/blog/2011/08/statically-linking-python-with-cython- generated-modules-and-packages/


1
投票

确实,您可以通过编辑

__init__.py
来修改包行为。

__init__.py
内部,变量all包含您使用
import *
调用的所有模块。在你的情况下,它是这样的:

__all__ = ["afunc", "bfunc"]
from a import afunc
from b import bfunc

请参阅以下主题...,可能会有所帮助;)


0
投票

在C++中添加

setenv("PYTHONPATH", ".", 0);


0
投票

嗯,10年后(2023年11月),但应该提到的是,还有“胶带”模块:

https://pypi.org/project/stickytape/

那个……:

[…] 可用于转换 Python 脚本和任何 Python 将其依赖的模块放入单文件 Python 脚本中。

© www.soinside.com 2019 - 2024. All rights reserved.