当我使用os.chdir公司()从脚本访问包目录?在
例如这里是我的包结构来演示这个问题。在
testpk/
testpk/bin
testpk/bin/runit.py
testpk/lib
testpk/lib/libcode.py
testpk/lib/__init__.py
这是我的lib代码,它只是打印导入的
^{pr2}$内容运行它.py在
#!/usr/bin/python
import sys, os
if __name__ == "__main__":
os.chdir('/home/moorepe/src/testpk')
print "working path = " , os.getcwd()
import lib.libcode
如果我运行runit,就会出现以下错误:
moorepe@halifax$ bin/runit.py
Traceback (most recent call last):
File "bin/runit.py", line 6, in <module>
import lib.libcode
ImportError: No module named lib.libcode
不过,使用python命令行进行测试,它可以正常工作:
cd testpk
python -c "import lib.libcode
I've been imported
这是从bin dir开始的:
cd testpk/bin
python -c "import os; os.chdir('/home/moorepe/src/testpk') ; import lib.libcode"
I've been imported
谁能解释一下出了什么问题吗?在
所以这个方法不起作用的原因是python除了使用PYTHONPATH之外,还使用currentdir作为路径。在
所以这个代码通过添加系统路径追加(“.”),因为我强制当前工作目录作为路径添加。在
您应该确保testpk/lib/在您的
PYTHONPATH
中。在是确保包在
PYTHONPATH
中的一种难看的方法。在“正确的方法”是将
testpk
包及其所有子目录放在Pythonsite-packages
目录中。在找出你的
^{pr2}$site-packages
(应该在你的PYTHONPATH
)在哪里。在会告诉你位置的。在
如果将当前目录的
'.'
添加到sys.path
搜索文件夹列表,则os.chdir()
将生效,import lib.libcode
应该开始工作:文件
runit.py
:我发现另一个有效的解决方案是:
这样,您的顶级库名看起来不是
lib
,而是libcode
。在“官方”(Pythonic)方式
如果要创建python模块,可能需要查看official documentation。他们建议使用
__init__.py
以及与模块的organizational structure相匹配的目录结构(这似乎是“Pythonic”的方法)。尽管任何传统的Ruby-ish或javaishlib
目录结构都是可行的,只要您理解模块的加载路径并对其进行适当的设置以使您的模块是可加载的。在相关问题 更多 >
编程相关推荐