使用\uu init\uuy.py导入libs

2024-04-26 02:44:19 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用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作为路径。在

所以这个代码通过添加系统路径追加(“.”),因为我强制当前工作目录作为路径添加。在


Tags: 代码pyimport路径src目录homebin
3条回答

您应该确保testpk/lib/在您的PYTHONPATH中。在

sys.path.append('/path/to/testpk/lib/') 

是确保包在PYTHONPATH中的一种难看的方法。在

“正确的方法”是将testpk包及其所有子目录放在Python site-packages目录中。在

找出你的site-packages(应该在你的PYTHONPATH)在哪里。在

^{pr2}$

会告诉你位置的。在

如果将当前目录的'.'添加到sys.path搜索文件夹列表,则os.chdir()将生效,import lib.libcode应该开始工作:

文件runit.py

#!/usr/bin/python
import  sys, os

if __name__ == "__main__":
    sys.path[0:0] = ['.']  # prefix current directory to list
    os.chdir('/home/moorepe/src/testpk')
    print "working path =", os.getcwd()
    import lib.libcode

我发现另一个有效的解决方案是:

import sys
import os.path
sys.path.insert(1, os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib') )

#from pprint import pprint as pp
#pp(sys.path)
import libcode

这样,您的顶级库名看起来不是lib,而是libcode。在

“官方”(Pythonic)方式

如果要创建python模块,可能需要查看official documentation。他们建议使用__init__.py以及与模块的organizational structure相匹配的目录结构(这似乎是“Pythonic”的方法)。尽管任何传统的Ruby-ishjavaishlib目录结构都是可行的,只要您理解模块的加载路径并对其进行适当的设置以使您的模块是可加载的。在

相关问题 更多 >

    热门问题