如何访问python包中顶级文件中的代码

时间:2014-06-25 04:24:39

标签: python packages

我有一个像这样的Python 2.7包:

hdl/
    __init__.py
    run_job.py
    other_stuff/
        __init__.py
        other_files/
setup.py
scripts/
    client.py

run_job.py包含:

def run_job():
    pass

没有课。实际上,这个代码库中没有任何类;我继承了它。

如何从此软件包的客户端执行run_job()函数?

(目前,run_job()函数位于__init__.py,我完全不喜欢。)

我把它们放在__init__.py

import hdl.run_job

import run_job

不管怎样,我得到No module named run_job。如果我完全取消导入,则客户端代码会显示'module' object has no attribute 'run_job'name 'run_job' is not defined,具体取决于我执行的操作:

import hdl
hdl.run_job

import hdl
run_job

我的setup.py

from setuptools import setup
from setuptools import find_packages
from os import walk, path

install_requires = [
    "ecdsa==0.11",
    "importlib==1.0.3",
    "paramiko==1.13.0",
    "pyasn1==0.1.7",
    "pycrypto==2.6.1",
    "wsgiref==0.1.2",
]

script_base = "scripts"
my_path = path.dirname(path.abspath(__file__))
walk_path = path.join(my_path, script_base)
for(_, _, filenames) in walk(walk_path):
    scripts = [("%s/%s"  % (script_base, f)) for f in filenames]
    break

setup(
    name="hdl",
    version="dev",
    description="HDL",
    url="http://example.com",
    long_description="HDLA",
    author="heh",
    author_email=".com",
    maintainer="foo",
    maintainer_email=".com",
    license="Proprietary",
    packages=find_packages(exclude=("tests",)),
    test_suite="nose.collector",
    include_package_data=True,
    package_data = {'': [ '*.csv', '*.hql', '*.pig', '*.sh', '*.sql' ]},
    install_requires=install_requires,
    zip_safe=False,
    classifiers=[
        "Development Status :: 2 - Alpha",
        "Environment :: Command Line",
        "Framework :: None",
        "Intended Audience :: Developers",
        "Intended Audience :: System Administrators",
        "License :: Other/Proprietary License",
        "Natural Language :: English",
        "Operating System :: MacOS :: MacOS X",
        "Operating System :: POSIX :: Linux",
        "Programming Language :: Python :: 2.7",
        "Topic :: Software Development",
        "Topic :: ETL"
    ],
    scripts=scripts,
)

如果我将run_job函数粘贴到__init__.py中,它可以正常工作:     import hdl     hdl.run_job()

3 个答案:

答案 0 :(得分:2)

将以下内容放入__init__.py

__all__ = ["run_job"]

在您的客户中:

from hdl import run_job
run_job.run_job()
你的setup.py“scripts”变量中的

没有定义,所以我不得不删除以下字符串:

脚本=脚本,

之后我运行了“sudo python setup.py install”并使用客户端进行了测试:

$ python
Python 2.7.6 (default, Mar 22 2014, 17:40:27) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from hdl import run_job
>>> run_job.run_job()
>>> 

一切正常。 尝试另一件事:

pydoc hdl

检查生成的doc中提供的路径是否指向正确的位置。

Help on package hdl:

NAME
    hdl

FILE
    <path-to-hdl>/hdl/__init__.py

PACKAGE CONTENTS
    run_job

所以,我有与你的完全相同的布局和setup.py文件。下面是文件的内容,它适用于我的comp。尝试与您拥有的内容进行仔细比较,并确保“setup.py install”没有任何错误。如果pydoc没有显示任何内容,则表示未安装hdl。

==========
run_job.py
=========== 
def run_job():
    pass

============    client.py    ===========

from hdl import run_job
run_job.run_job()

============    setup.py    ===========

与你的完全一样

答案 1 :(得分:2)

您的客户端代码需要执行from hdl import run_job然后执行run_job.run_job(),或者(可能更具可读性)from hdl.run_job import run_job

如果您想提供&#34;顶级&#34;访问run_job(即,不要求用户导入run_job模块以获取run_job功能),然后在您的顶级__init__.py执行from .run_job import run_job }。然后,客户可以import hdl,然后使用hdl.run_job

答案 2 :(得分:0)

该文件未命名为run_job.py,其名称为其他名称。 。修复名称会导致一切正常。

其他答案是正确的;将__init__.py留空并在client.py执行此操作:

from hdl import run_job
run_job.run_job()

from hdl.run_job import run_job
run_job()

或将其放入__init__.py

from .run_job import run_job

,这在client.py

import hdl
hdl.run_job() # won't work