<p>不需要在一个文件中编写所有的matlab函数。你也可以保留你想要的库的文件夹结构。但是,您应该将最深子文件夹中的所有函数写入一个<code>*.py</code>文件。你知道吗</p>
<p>假设您的MATLAB库位于<code>space_engineering</code>文件夹中,设置如下:</p>
<pre><code>space_engineering\
subfolder1\
functiongroup1\
printfoo.m
printbar.m
subfolder2\
...
subfolder3\
...
...
</code></pre>
<p>在执行<code>addpath(genpath('\your_path\space_engineering'))</code>之后,子文件夹<code>subfolder*</code>和<code>functiongroup*</code>中的所有函数在全局名称空间中可用,如下所示</p>
<pre><code>>> printfoo % function printfoo does only do fprintf('foo')
foo
</code></pre>
<p>我知道这是您希望在迁移的python库中保留的行为。这是有办法做到的。新的python库的结构如下:</p>
<pre><code>space_engineering\
__init__.py
subfolder1\
__init__.py
functiongroup1.py
functiongroup2.py
subfolder2\
__init__.py
...
subfolder3\
__init__.py
...
...
</code></pre>
<p>如您所见,最深的子文件夹层<code>functiongroup*</code>的MATLAB结构现在被<code>functiongroup*.py</code>文件替换,即所谓的<em>模块</em>。您必须考虑的唯一折衷是函数<code>printfoo()</code>和<code>printbar()</code>现在是在这个<code>.py</code>模块中定义的,而不是单独的<code>.py</code>文件。你知道吗</p>
<pre><code># content of functiongroup1.py
def printfoo():
print(foo)
def printbar():
print(bar)
</code></pre>
<p>为了实现与MATLAB中相同的函数调用,必须通过调整每个子文件夹的<code>__init__.py</code>文件,使函数名<code>printfoo</code>和<code>printbar</code>在全局命名空间中可用</p>
<pre><code># content of space_enginieering\subfolder1\__init__.py
from .functiongroup1 import *
from .functiongroup2 import *
</code></pre>
<p>以及主文件夹的<code>__init__.py</code></p>
<pre><code># content of space_engineering\__init__.py
from .subfolder1 import *
from .subfolder2 import *
from .subfolder3 import *
</code></pre>
<p><code>from .functiongroup1 import *</code>语句将模块<code>functiongroup1</code>中的所有名称加载到<code>subfolder1</code>的命名空间中。依次<code>from .subfolder1 import *</code>将它们转发到全局命名空间。你知道吗</p>
<p>您可以在python控制台(或任何脚本)中这样做,例如:</p>
<pre><code>>>> sys.path.append('\your_path\space_engineering')
>>> from space_engineering import *
>>> printfoo()
foo
</code></pre>
<p>这样,您就可以像以前使用MATLAB库一样使用新的python库。你知道吗</p>
<hr/>
<p>但是:在python中不建议使用<code>from xyz import *</code>语句(参见<a href="https://stackoverflow.com/questions/2386714/why-is-import-bad">here</a>为什么,这类似于为什么不在MATLAB中使用<code>eval</code>),一些Pythonistas可能会抱怨建议这样做。但是对于您的特殊情况,您坚持创建一个类似MATLAB的python库,这是一个合适的解决方案。你知道吗</p>