如何封装Python模块?
有没有办法把Python的'mechanize'和'BeautifulSoup'这两个模块放到一个单独的.py文件里?
我的问题是这样的:我有一个Python脚本需要用到mechanize和BeautifulSoup。我是从一个PHP页面调用这个脚本的。我的网络服务器支持Python,但没有安装这些模块。所以我想要这样做。
抱歉如果这个问题听起来很傻。
补充:谢谢大家的回答。我觉得解决这个问题的方法可能和virtualenv有关。能不能有人用非常简单的语言给我解释一下这个?我看过virtualenv的页面,但还是很困惑。再次感谢大家。
3 个回答
不,一般来说你是做不到的,因为这样会破坏Python查找模块的方式(也就是查找文件和文件夹的方式)。我想如果你真的想搞定这个,可能可以通过一些黑科技来生成一个模块的层级结构,而不需要实际的文件系统布局,但这真的是个大工程,可能会像下面这样
>>> sha=types.ModuleType("sha")
>>> sha
<module 'sha' (built-in)>
['__doc__', '__name__']
>>> sha.foo=3
>>> sha.zam=types.ModuleType("zam")
>>> sha.foo
3
>>> dir(sha)
['__doc__', '__name__', 'foo', 'zam']
不过无论如何,你都得生成一些代码来创建这个布局,并把东西存储到正确命名的标识符里。
你可能需要学习如何使用 .egg 文件。它们就像 .jar 文件一样,是包含你库的独特集合体。
其实你不需要把文件合并在一起,也不需要把它们安装到系统的公共位置。只要确保这些库文件放在你的Python脚本可以读取的目录里(这样你的PHP应用也能读取),并且把它们添加到Python的加载路径中就可以了。
Python运行时会在sys.path
这个数组里的目录中寻找库文件。你可以通过设置PYTHONPATH
环境变量,或者直接把目录添加到sys.path
中,来在运行时增加这些目录。下面的代码片段可以放到Python脚本中,它会把脚本所在的目录添加到搜索路径里,这样同一位置的库就可以被导入使用了:
import os, sys
sys.path.append(os.path.dirname(__file__))
看看virtualenv吧,它可以帮助你创建一个本地的Python环境。在这个环境里,你可以安装BeautifulSoup和其他你想要的库。