Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造python项目的非常简单的方法是什么?_Python_Module_Package_Python Import_Project Structure - Fatal编程技术网

构造python项目的非常简单的方法是什么?

构造python项目的非常简单的方法是什么?,python,module,package,python-import,project-structure,Python,Module,Package,Python Import,Project Structure,所以我有一个python的东西需要处理一个文件 首先是: my_project/ ├── script.py my_project/ ├── script.py ├── util/ │ └── string_util.py ├── services/ │ └── my_service.py 我只需使用python script.py file.csv运行它 然后它成长为: my_project/ ├── script.py my_project/ ├── script.py ├──

所以我有一个python的东西需要处理一个文件

首先是:

my_project/
├── script.py
my_project/
├── script.py
├── util/
│   └── string_util.py
├── services/
│   └── my_service.py
我只需使用
python script.py file.csv
运行它

然后它成长为:

my_project/
├── script.py
my_project/
├── script.py
├── util/
│   └── string_util.py
├── services/
│   └── my_service.py
(每个目录中都有一个空的
\uuuu init\uuuu.py

但是现在
我的服务.py
想要使用
字符串util.py
,如何很好地做到这一点非常不简单

我想在
我的服务.py中执行
从..util导入字符串\u util
(使用
从服务导入我的服务
)导入到
脚本.py
),但这不适用于
python script.py
,因为
我的
服务
名称
只是
服务。我的
服务(并且我得到了
在顶级包之外尝试的相对导入

  • 我可以做
    cd..
    python-m my_project.script
    ,但这看起来太不自然了,如果把它放在自述文件中以了解如何运行它,那就太糟糕了

  • 现在我正在用丑陋的
    sys.path.append()
    hack解决这个问题


我还有其他选择吗

这几乎是众说纷纭,但我将分享我对这一点的看法

你应该以不同的方式看待你的项目。选择一个执行点,并从那里引用导入,以避免尝试处理的所有奇怪的相对导入。因此,看看您的项目结构:

my_project/
├── script.py
├── util/
│   └── string_util.py
├── services/
│   └── my_service.py
正如您当前所做的那样,从
myu项目中执行代码。那样的话,你所有的导入都应该是关于这一点的。因此,您的导入实际上如下所示:

# my_service.py

from util.string_util import foo
考虑这一点的另一种方式是,如果您正在移动项目,或者有一个CI,则需要确保指定要从中执行的项目根目录。记住这些,并指定项目应该执行的单一执行点,这将使您在构建包和模块并适当引用它们时的生活更加轻松,允许其他系统正确使用您的项目,而不必处理奇怪的相对导入


希望这有帮助

我可以分享我对此的看法,但它将作为一个答案发布。让我知道你的想法。哇,我其实一点都没想到。这很简单。所以我可以从..util导入字符串中删除
,一切都很好。(如果我对这里的绝对进口很酷的话,我就是。)这确实有帮助。谢谢