我很想知道因为我在将嵌入式模块导入嵌入式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)
谢谢!
答案 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);