是否可以完全展平python包,完全删除目录?

时间:2014-05-26 21:44:36

标签: python c++ python-2.6 python-c-api

我很想知道因为我在将嵌入式模块导入嵌入式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

WHile仍然保持从我的主程序中导入的能力:

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)

谢谢!

3 个答案:

答案 0 :(得分:0)

确实,您可以通过修改__init__.py来修改您的包行为。

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

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

请参阅the following subject ...,这可能会有所帮助;)

答案 1 :(得分:0)

我通过搜索目录中的所有模块并删除所有实例(使用' sed'或sublime text:D)来获取我的代码:

Packz。

例如:

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

(只有你的init文件有一些版本信息才会出现这种情况,如果它是空的你可以删除它)


现在在您的代码中,您必须直接引用模块而不是包。

如果您愿意,可以添加:

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

到您的Packz.py文件,如果您需要它从一个独立模块一次导入所有模块。

对于那些在虚拟文件系统中遇到导入搜索功能问题的人来说,这似乎是一个不错的解决方案,尽管不是那么动态。 (appart来自黑客攻击python导入功能)

这是另一个:(通过cython生成将模块包转换为c然后将模块嵌入到应用程序二进制文件中,然后您不必担心路径问题... +它使代码运行更快)

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

答案 2 :(得分:0)

在C ++中添加

setenv(“PYTHONPATH”,“。”,0);