c++ 有没有可能完全扁平化一个python包,完全删除目录?

vddsk6oq  于 11个月前  发布在  Python
关注(0)|答案(4)|浏览(91)

我想知道,因为我有一些大问题与导入包模块到我的嵌入式python enterpreter,无论sys.path。
比如说。
我的包裹。

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)
谢谢你,谢谢

qzwqbdag

qzwqbdag1#

我通过搜索目录中的所有模块并删除以下内容的所有示例(使用“sed”或sublime text:D),使代码正常工作:
帕茨。
例如:

from Packz.a import afunc

becomes:

from a import afunc

and


from Packz import a
becomes:

import a

个字符
(this只有当你的init文件有一些版本信息时才是这种情况,如果它是空的,你可以删除它)
现在在你的代码中你必须直接引用模块而不是包。
如果需要,您可以添加:

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


如果需要从单个独立模块中一次导入所有模块,请将其添加到Packz.py文件中。
对于那些对虚拟文件系统中的导入搜索功能有问题的人来说,这似乎是一个不错的解决方案,尽管不是动态的。
这是另一种:(生成通过cython将您的模块包转换为c语言,然后将模块嵌入到您的应用程序二进制文件中,这样您就不必担心路径问题...+它使代码运行得更快)
http://mdqinc.com/blog/2011/08/statically-linking-python-with-cython-generated-modules-and-packages/

cnh2zyt3

cnh2zyt32#

实际上,您可以通过编辑__init__.py来修改包的行为。
__init__.py内部,变量all包含了所有你用import *调用的模块。在你的例子中,它是这样的:

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

字符串
the following subject ...,可能会有帮助;)

yc0p9oo0

yc0p9oo03#

在C++中添加
setenv(“pythonPATH”,“.",0);

shstlldc

shstlldc4#

还有'sticky tape'模块:
https://pypi.org/project/stickytape/
那...:
[...]可用于将Python脚本及其依赖的任何Python模块转换为单文件Python脚本。
(This该模块于2021年发布,因此在发布问题时无法使用。

相关问题