使用init导入名称的sys.path上的package可以在内部使用,但不能在其外部使用

时间:2015-08-06 15:02:30

标签: python packages pythonpath

我有一个包my_scripting_library我想在机器上的任何地方使用。它有一个init.py:

from silo_functions import *

看起来像

my_scripting_library
  -__init__.py
  -silo_functions.py
  -test_stuff.py

test_stuff.py看起来像:

#!/usr/bin/env python

from silo_functions import *

lines = read_lines('filepath.py')

print lines

在bashrc中:

export PYTHONPATH="${PYTHONPATH}:$LIBRARY"

其中LIBRARY是my_scripting_library的正确文件路径

In [1]: import sys

In [2]: sys.path
Out[2]: 
['',
 '/usr/bin',
 '/usr/lib/python2.7/site-packages/lxml-3.3.3-py2.7-linux-x86_64.egg',
 '/home/cchilders/scripts/python/my_scripting_library',
...
 '/home/cchilders/.ipython']

运行带有from .silo_functions import *的test_stuff会导致:

Traceback (most recent call last):
  File "./test_stuff.py", line 3, in <module>
    from .silo_functions import *
ValueError: Attempted relative import in non-package

运行带有from my_scripting_library.silo_functions import *的test_stuff会导致:

Traceback (most recent call last):
  File "./test_stuff.py", line 3, in <module>
    from my_scripting_library.silo_functions import *
ImportError: No module named my_scripting_library.silo_functions

但运行带from silo_functions import *的test_stuff有效:

打印行

当然我不能在其他文件夹中使用这个包,这是真正的问题 - 我不想被迫在这一个地方抛出所有脚本。这导致了巨大的问题,因为我不断地重复使用每个脚本的几十个函数,并且超过5个关于使文件夹成为python包的教程从未工作过。为什么python路径上有一个init而不是包?谢谢

1 个答案:

答案 0 :(得分:1)

可能是因为您已将'... / python / my_scripting_library '添加到您的路径中。但是此文件夹中没有'my_scripting_library.py'

如果您想使用'my_scripting_library.silo_functions',请尝试添加'/ home / cchilders / scripts / python'(不是'/ home / cchilders / scripts / python / my_scripting_library')路径。 因为'my_scripting_library'是模块。 Python将找到此文件夹,在此文件夹中找到__init__.py并将其标记为模块。