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方法是什么?
答案 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”,将单独开发的包带入消费项目。