从包中运行脚本

时间:2014-03-25 12:50:34

标签: python

我是来自java的python的新手。我创建了一个名为“Project”的文件夹。在'Project'中,我创建了许多包(包含__init__.py个文件),例如'test1'和'tests2'。 'test1'包含一个python脚本文件.py,它使用'test2'中的脚本(从test2导入一个模块)。我想从命令行在'test1'中运行脚本x.py。我怎么能这样做?

编辑:如果您对如何更好地整理文件有更好的建议,我将非常感激。 (注意我的java心态)

编辑:我需要从bash脚本运行脚本,所以我需要提供完整路径。

2 个答案:

答案 0 :(得分:1)

可能有几种方法可以达到你想要的效果。

当我需要确保可执行脚本中的模块路径正确时,我做的一件事是获取父目录并插入模块搜索路径(sys.path):

import sys, os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

import test1 # next imports go here...
from test2 import something
# any import what works from the parent dir will work here

通过这种方式,您可以安全地运行脚本,而无需担心脚本的调用方式。

答案 1 :(得分:1)

Python代码被组织成模块和包。模块只是一个.py文件,可以包含类定义,函数定义和变量。包是一个带有__init__.py文件的目录。

标准Python项目可能如下所示:

thingsproject/
  README
  setup.py
  doc/
     ...
  things/
    __init__.py
    animals.py
    vegetables.py
    minerals.py
  test/
    test_animals.py
    test_vegetables.py
    test_minerals.py

setup.py文件描述了有关项目的元数据。请参阅Writing the Setup Script,尤其是installing scripts上的部分。

Entry points用于帮助在Python中分发命令行工具。入口点在setup.py中定义如下:

setup(
    name='thingsproject',
    ....
    entry_points = {
        'console_scripts': ['dog = things.animals:dog_main_function']
    },
    ...
)

效果是,使用python setup.py install安装软件包时,会根据您的操作系统在某个合理的位置自动创建脚本,例如/usr/local/bin。然后,该脚本会调用dog_main_function包的animals模块中的things

另一个要考虑的Python约定是__main__.py file。这表示目录中的“main”脚本或充满python代码的zip文件。这是使用命令行参数的argparse解析器为代码定义命令行界面的好地方。

Python Packaging User Guide可以找到关于Python包装有点混乱的世界的最新信息。