我有一个像这样的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()
答案 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