用于创建和使用用户创建的共享库的Pythonic方法

时间:2016-02-11 09:06:32

标签: python python-3.x pycharm

tl; dr我的各种项目目录之外的公共文件目录。什么是在我的项目中使用/导入这些公共文件以及将它们构建到输出目录中的pythonic方法。

背景: 我在学校并参加一个使用Python作为语言的数据结构类。我正在学习这些语言,但是在尝试维护共享代码库时遇到了一些问题。

在我使用的所有其他语言中,无论是编译还是解释,都有一种相当直观的方法可以将共享模块与使用它们的代码分开,这样更新共享模块就不会需要更新调用代码。

这就是我最初组织目录结构的方式。

/.../Projects
    Assignment_1
        __init__.py
        classA.py
        classB.py
    Assignment_2
        __init__.pu
        classC.py
    (etc)

在意识到稍后需要classA和classB的大部分功能之后,我重新组织了这个:

/.../Projects
    Common
        Sorters
            __init__.py
            BubbleSort.py
            MergeSort.py
        __init__.py
        SimpleProfiler.py
    Assignment_1
        __init__.py
        main.py
    Assignment_2
        __init__.py
        main.py

我的问题是我找不到从main,py导入SimpleProfiler或MergeSort之类的好方法。现在我手动将所有Common文件复制到每个作业中,这很糟糕。

据我所知,一个可能的解决方案是更新路径以在每个main.py文件中包含公用文件夹表单,但我也读到这非常hacky并且不鼓励。

另一个Stackoverflow对类似问题的回答表明用户在一个大项目下构建了所有内容。我尝试了这个,但仍然无法将模块从一个兄弟导入另一个兄弟。

我的另一个问题是如何在提交作业时将所有内容打包在一起。在其他语言中,很容易实现一个构建脚本,它将扫描主项目中的任何导入,然后将这些导入的文件复制(展平)到一个输出目录中,然后我可以压缩并提交以进行评分。我正在使用PyCharm,但似乎无法找到一种方法来引用导入作为构建过程的一部分。这有什么脚本吗?无论解决方案是什么,我都需要能够以这样一种方式提交项目,即教师所要做的就是调用一个python文件(例如main.py)

这个问题并非学校环境所独有,但对于大多数编程项目来说似乎都是普遍存在的。那么,管理共享代码库以及将共享代码构建到最终项目中的pythonic方法是什么?

3 个答案:

答案 0 :(得分:1)

尝试将PYTHONPATH环境变量设置为您的目录。 Python首先搜索在sys.path中导入的文件,sys.path中的第一个目录是当前目录。 PYTHONPATH是python将寻找文件的下一个。

答案 1 :(得分:1)

[免责声明:我认为最好使用PYTHONPATH环境变量]

我想到了两个非常相似的选择:

/.../Projects
    Common
        Sorters
            __init__.py
            BubbleSort.py
            MergeSort.py
        __init__.py
        SimpleProfiler.py
    assignment_1.py
    assignment_2.py

如果您从assignment_1.py使用以下导入:from Common.Sorters.BubbleSort import bubble_sort。这是因为,默认情况下,PYTHONPATH将当前路径视为有效的PYTHONPATH。这是假设您直接调用脚本assignment_*

另一种选择是:

/.../Projects
    Common
        Sorters
            __init__.py
            BubbleSort.py
            MergeSort.py
        __init__.py
        SimpleProfiler.py
    Assignment_1
        __init__.py
        __main__.py
    Assignment_2
        __init__.py
        __main__.py

并调用这样的作业:python -m Assignment_1(<{>来自Projects文件夹)。默认情况下,&#34;执行&#34;像这样的模块将加载其__main__.py代码。 (这不是一个严格的解释,虽然the official one有点短。)

它的工作原理和以前一样:Python解释器会将当前路径视为有效的PYTHONPATH。

答案 2 :(得分:0)

在最小端,创建一个PyCharm运行配置,在执行之前设置PYTHONPATH并包含另一个目录。这样您就不需要在代码中执行sys.path调用。

更接近“完美”结束,使用setup.py将您的其他目录放入Python包中。然后,使用项目中的解释器,执行“python path / to / other / dir / setup.py develop”,将单独开发的包带入消费项目。