我想知道,因为我有一些大问题与导入包模块到我的嵌入式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)
谢谢你,谢谢
4条答案
按热度按时间qzwqbdag1#
我通过搜索目录中的所有模块并删除以下内容的所有示例(使用“sed”或sublime text:D),使代码正常工作:
帕茨。
例如:
个字符
(this只有当你的init文件有一些版本信息时才是这种情况,如果它是空的,你可以删除它)
现在在你的代码中你必须直接引用模块而不是包。
如果需要,您可以添加:
型
如果需要从单个独立模块中一次导入所有模块,请将其添加到Packz.py文件中。
对于那些对虚拟文件系统中的导入搜索功能有问题的人来说,这似乎是一个不错的解决方案,尽管不是动态的。
这是另一种:(生成通过cython将您的模块包转换为c语言,然后将模块嵌入到您的应用程序二进制文件中,这样您就不必担心路径问题...+它使代码运行得更快)
http://mdqinc.com/blog/2011/08/statically-linking-python-with-cython-generated-modules-and-packages/
cnh2zyt32#
实际上,您可以通过编辑
__init__.py
来修改包的行为。在
__init__.py
内部,变量all包含了所有你用import *
调用的模块。在你的例子中,它是这样的:字符串
the following subject ...,可能会有帮助;)
yc0p9oo03#
在C++中添加
setenv(“pythonPATH”,“.",0);
shstlldc4#
还有'sticky tape'模块:
https://pypi.org/project/stickytape/
那...:
[...]可用于将Python脚本及其依赖的任何Python模块转换为单文件Python脚本。
(This该模块于2021年发布,因此在发布问题时无法使用。