如何在不更改导入的情况下将Python 3模块更改为包?

时间:2017-11-14 00:47:26

标签: python python-3.x

是否可以在不更改其他文件中的<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Status: EN-ROUTE" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lblP2Status" android:gravity="center" /> <TextView android:text="00:00:00" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lblP2Timer" android:gravity="center" android:layout_marginBottom="19.0dp" /> <Button android:text="Update" android:layout_width="match_parent" android:layout_height="64.5dp" android:id="@+id/cmdP2Update" android:layout_marginBottom="10.5dp" android:background="@android:color/holo_green_dark" /> <Button android:text="ARRIVED" android:layout_width="match_parent" android:layout_height="64.5dp" android:id="@+id/cmdP2Arrived" /> <Button android:text="SELF DEPLOYED" android:layout_width="match_parent" android:layout_height="64.5dp" android:id="@+id/cmdP2SelfDeployed" android:layout_marginBottom="10.5dp" /> <Button android:text="CALL ME" android:layout_width="match_parent" android:layout_height="64.5dp" android:id="@+id/cmdP2CallMe" android:layout_marginTop="0.0dp" /> <TextView android:text="Are you sure?" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lblP2Confirm" android:gravity="center" android:layout_marginBottom="16.0dp" android:visibility="gone" /> <LinearLayout android:orientation="horizontal" android:minWidth="25px" android:minHeight="25px" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1"> <Button android:text="OK" android:layout_width="190dp" android:layout_height="wrap_content" android:id="@+id/cmdOk" android:visibility="gone" /> <Button android:text="Cancel" android:layout_width="190dp" android:layout_height="wrap_content" android:id="@+id/cmdCancel" android:visibility="gone" /> </LinearLayout> </LinearLayout> 语句的情况下将Python模块更改为包?

示例:项目中的其他文件使用importimport xx,但我想将其移至x.py之类,而不更改导入语句其他文件到./x/x.py

即使我在from x import x中使用__all__ = ["x"],也需要__init__.py才能正常工作。

有没有办法或者我必须更新其他文件中的from x import x语句?

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是移动x.py - 但随后创建一个新的x.py(或在此情况下,__init__.py位于x目录中)曾经暴露的一切。

例如,如果x.py包含def example,您可以使用from x import example导入此内容。这基本上是真正定义的代理。

如果我没有足够清楚地解释这一点,请告诉我。

答案 1 :(得分:1)

可能是在x/__init__.py中使用通配符导入的罕见原因之一:

from .x import *

答案 2 :(得分:1)

这个问题最干净的解决方案是拥有一个合适的命名空间包,因此你的导入不会是隐式的。

现在,那说,实现你所要求的另一种选择是修改PYTHONPATH以便正确解决导入,为此基本上没有办法:

  1. 通过在python代码中对sys.pathos.environ['PYTHONPATH']进行硬编码来更改PYTHONPATH
  2. 更改系统范围内的PYTHONPATH
  3. 在系统范围的python发行版上使用.pth文件
  4. 在virtualenv上使用.pth文件
  5. 但我强烈反对这些,只是因为你想要修改PYTHONPATH,如果你想导入不可安装的pypi包或指向外部包(在这种情况下你已经满了)控制你的包)这是不可安装的(setup.py)并由当前的PYTHONPATH解决。

    虽然我最好的建议,请按照https://www.python.org/dev/peps/pep-0008/#imports