[英]How to access code in a top-level file in a python package
我有一个如下所示的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
得到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
则可以正常工作:导入hdl hdl.run_job()
将以下内容放在__init__.py
:
__all__ = ["run_job"]
在您的客户中:
from hdl import run_job
run_job.run_job()
在您的setup.py“脚本”变量中未定义,因此我必须删除以下字符串:
脚本=脚本,
之后,我运行“ 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
检查生成的文档中提供的路径是否指向正确的位置。
Help on package hdl:
NAME
hdl
FILE
<path-to-hdl>/hdl/__init__.py
PACKAGE CONTENTS
run_job
因此,我的布局和setup.py文件与您的完全相同。 以下是文件的内容,可以在我的电脑上使用。 尝试仔细比较您所拥有的,并确保“ 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 ============
和你一样
您的客户端代码需要from hdl import run_job
,然后执行run_job.run_job()
,或者from hdl.run_job import run_job
(可能更具可读性) from hdl.run_job import run_job
。
如果要提供对run_job
“顶级”访问run_job
(即,不要求用户导入run_job
模块以获取run_job
函数),则在顶级__init__.py
, from .run_job import run_job
。 然后,客户端可以import hdl
,以后再使用hdl.run_job
。
该文件的名称不是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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.