当前位置: 首页 > 知识库问答 >
问题:

如何运行Python 3脚本与导入从一个子文件夹?

谭泳
2023-03-14

不管我怎么做, 自从我切换到Python 3之后 我只能从项目的根文件夹运行导入脚本,但不能从子文件夹运行导入脚本。我知道这里有很多关于我收到的错误html" target="_blank">消息的问题,但是建议的解决方案对我来说并不适用。有人能为这个小样本项目提供一个样本解决方案吗?我相信这会得到很多人的赞赏。

proj
├── foofolder
│   ├── __init__.py
│   └── foofile.py
├── subfolder
│   ├── __init__.py
│   └── run.py
└── __init__.py

我在foofile.py中定义了函数fofund(),并希望在run.py中调用它。

如果run.py直接在proj中工作。但是(只是为了让事情井井有条),我想把它放在一个子文件夹里——这令人惊讶地似乎是不可能的。

恼人的是,我的IDE中的自动完成(PyCharm)建议从FooFoodFolder中删除。foofile导入foofun应该可以工作。但事实并非如此。我也无法想象任何其他意义:

从文件夹中。foofile导入foofun--

来自。文件夹。foofile导入foofun--

来自项目。文件夹。foofile导入foofun--

甚至绝对进口也不起作用。为什么找不到proj

sys。路径是:['/parent/proj/subfolder'、'/parent/env/lib/python35.zip'、'/parent/env/lib/python3.5'、'/parent/env/lib/python3.5/plat-x86_64-linux-gnu'、'/parent/env/lib/python3.5/lib dynload'、'/usr/lib/python3.5'、'/usr/lib/python3.5/packages/env-64-linux-gnu'>

我使用Python 3.5。2在虚拟世界里。

编辑:当我认为这个问题特定于Python 3时,我错了。当我签入Python2.7时,问题和解决方案是相同的。12

Pevogam给出的解决方案起作用。第一个字面上只添加了'...''sys.path',它描述了执行run.py的父文件夹。第二个显式地添加了'/父/proj'


共有3个答案

徐景明
2023-03-14

我通常在Django项目中需要这个,我刚刚意识到Django提供了一个非常方便的解决方案,它为我解决了这个问题:

$ python manage.py shell < app/utils/scripts/script.py 

脚本中。py我的导入内容如下:

from app.utils.functions.do_things import do_this, do_that

在这里找到:如何从Django shell执行Python脚本

蒋健
2023-03-14

添加到bashrc:别名pys=PYTHONPATH=. python3。然后pys子文件夹/run.py工作!

注释:对我来说,脚本只是执行任务。它从不从其他地方调用或导入。我有很多。其中一些类似(例如,taskbu reset.pytaskbu reset.py)。我更喜欢将其组织为taskA/reset。py等等。但是,那就不可能再运行它们了!但是,预先设置路径是一个简单的解决方案,它不需要我更改任何python代码。

吕嘉荣
2023-03-14

我能想到的最快的方法是:

# subfolder/run.py
import sys
sys.path.append("..")

from foofolder.foofile import foofun

foofun()

但是请注意,只有在从其文件夹中运行run.py时,这才有效。不依赖于此的更复杂的方法是

# subfolder/run.py
import sys
import os.path as o
sys.path.append(o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")))

from foofolder.foofile import foofun

foofun()

你可以从任何地方到达功能。对于所有这些模块来说,最简单的方法是使用指向根包的相同指针,在您的情况下,这是通过添加“...”来实现的。然后,您可以从这个根包的角度执行任何导入。

我倾向于避免使用相对导入,因为它们会让人困惑,并降低可读性,但希望这能有所帮助。

[*]一些IDE可能会执行自己的项目扫描,这就是为什么只要您在IDE中运行python代码,它们仍然可以找到导入。

 类似资料:
  • 问题内容: 我有一个复杂的gradle脚本,该脚本封装了围绕将多个netbeans项目构建和部署到许多环境的功能。 该脚本可以很好地运行,但是从本质上来说,它是通过六个包含项目和环境信息的地图进行配置的。 我想将任务抽象到另一个文件中,以便可以在一个简单的构建文件中简单地定义地图,然后从另一个文件中导入任务。这样,我可以对多个项目使用相同的核心任务,并使用一组简单的地图来配置这些项目。 谁能告诉我

  • 问题内容: 在我的终端中,输入,输出 我想将Atom配置为运行Python3脚本。在我的Atom Config中, 但是,如果我在名为的某些脚本中运行以下脚本, 我得到以下输出: 如何正确设置PATH以使Python3.x脚本正确运行?我可以使用其他包装吗? 问题答案: 转到Atom的菜单栏->包->脚本->配置脚本(或者,您可以使用快捷键Shift + Ctrl + Alt + O) 然后键入到

  • Pm2默认的start命令使用Python2运行脚本。如何让它使用python3运行脚本?假设我的脚本名为app.py。

  • 问题内容: 我想从另一个Python脚本运行一个Python脚本。我想像使用命令行一样传递变量。 例如,我会跑我的,将通过值(0,1,2,3)的列表迭代第一个脚本,并通过那些到第二脚本,然后,等 我发现了Stack Overflow问题1186789,这是一个类似的问题,但是ars的答案调用了一个函数,在这里我想运行整个脚本,而不仅仅是函数,而balpha的答案则调用了脚本,但没有参数。我将其更改

  • 我想从python脚本内部运行下面的bash脚本。 我的python脚本/函数如下所示 但是,我收到以下错误 - 我正在使用集群,我的系统规格如下 - 如果我遗漏了什么,请告诉我。我的基本问题是如何从给定的python脚本运行另一个python script,特别是当我们需要激活和停用虚拟环境时,因为由于一些依赖冲突,父python script和子python cript需要两个不同的虚拟环境。

  • 问题内容: 我只是想从另一个文件中加入我的Swift类,例如它的测试 PrimeNumberModel.swift PrimeNumberModelTests.swift 两个swift文件都在同一目录中。 问题答案: 我的文件中也遇到了同样的问题,但常规项目文件中却没有。 摆脱: 使用未解析的标识符“ PrimeNumberModel” 我需要测试文件中的基本模块。在我的情况下,我的 目标 称为