所以,我在Stack Overflow上看到了一些类似的问题,但似乎没有解决我的问题或一般情况.所以,希望这个问题可以解决这个问题,并且让我头痛不已.我有一个形式的git repo:
repo/
__init__.py
sub1/
__init__.py
sub1a/
__init.py
mod1.py
sub2/
__init__.py
mod2.py
Run Code Online (Sandbox Code Playgroud)
如何从mod1.py导入mod2.py,反之亦然,这取决于mod1.py或mod2.py是脚本(当每个分别导入 - 未导入时)如何变化?
我正在尝试学习python而我在导入模块时遇到问题.我有一个.pyc文件,我试图导入到名为dfa.pyc的空闲shell中
我把文件放在一个名为xyz的文件夹中.我使用以下方法导航到此文件夹
os.chdir('/Users/xxx/Desktop/xyz')
Run Code Online (Sandbox Code Playgroud)
所以现在,如果我尝试运行命令:
from dfa import *
Run Code Online (Sandbox Code Playgroud)
我收到错误:
ImportError: No module named dfa
Run Code Online (Sandbox Code Playgroud)
如果我运行命令:
os.path.isfile('dfa.pyc')
Run Code Online (Sandbox Code Playgroud)
它返回true.
有人可以解释我如何导入dfa.pyc文件?
谢谢
我知道有是一吨的如何对导入Python模块不在路径,但我还没有遇到过使用Python的__init.py__ VS sys.path.insert.哪种方法更好?是否有任何明显的缺点,如性能?还有一个"Pythonic?"
我能想到的一个场景是,我有一个用户下载并放在任何目录中的程序,所以我不知道绝对路径(除非我以编程方式得到它).文件夹结构是
working dir
__init__.py
foo.py
src/
my_utils.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
我没有看到使用__init__.py或更改sys.path之间的任何区别.有没有什么方案你可以想到它会产生什么影响?
我的问题的第2部分是,为什么你必须做任何事情才能从子目录导入模块?我对Python很新,所以也许我不明白为什么摆弄路径或创建init文件是样板文件.对我来说,这似乎是一种不必要的复杂情况.如果我在当前工作目录中有"dir"并说"import dir.my_utils",我不明白为什么我要列出我希望能够在__init__.py中导入的所有内容.
如果这是重复的道歉,但我在发布之前进行了搜索.
编辑:这是另一个有用的链接:自动调用常见的初始化代码而不创建__init__.py文件
我有这样的文件夹结构
\n\nmain_folder\n|\n|--done\n| |\n| |--test1\n| |--__init__.py\n|\n|---check.py\nRun Code Online (Sandbox Code Playgroud)\n\n__init__.py:
\n\nclass Tries(object):\n def __init__(self):\n print "Test"\nRun Code Online (Sandbox Code Playgroud)\n\n检查.py:
\n\nfrom done.test1 import Tries\nTries()\nRun Code Online (Sandbox Code Playgroud)\n\n错误:
\n\n---------------------------------------------------------------------------\nImportError Traceback (most recent call last)\n<ipython-input-8-10953298e1df> in <module>()\n----> 1 from done.test1 import Tries\n\nImportError: No module named done.test1 \nRun Code Online (Sandbox Code Playgroud)\n\n我无法从嵌套文件夹导入模块。有什么办法可以做到这一点吗?
\n\n编辑:
\n\n在萨尔瓦的回答之后,我改变了我的结构,如下所示
\n\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 check.py\n|--__init__.py(no content)\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 done\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py(no content)\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test1\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py <-- this files contains your Tries class\nRun Code Online (Sandbox Code Playgroud)\n\n现在也抛出同样的错误。
\n什么是最好的(阅读:最干净的)告诉Python从某个文件夹导入所有模块的方法?
我想让人们把他们的"mods"(模块)放在我的应用程序的一个文件夹中,我的代码应该在每次启动时检查并导入放在那里的任何模块.
我也不希望在导入的东西中添加额外的范围(不是"myfolder.mymodule.something",而是"东西")
我有两个 Python 包,其中一个需要由另一个导入。目录结构如下:
workspace/
management/
__init__.py
handle_management.py
other_management.py
utils/
__init__.py
utils_dict.py
Run Code Online (Sandbox Code Playgroud)
我正在尝试从文件utils中的项目导入功能handle_management.py:
import utils.utils_dict
Run Code Online (Sandbox Code Playgroud)
我在尝试运行时遇到错误handle_management.py:
ImportError: No module named utils.utils_dict
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多有关如何解决此问题的文章,但似乎找不到有效的解决方案。
我从从相对路径导入模块开始- 我尝试了适用的解决方案,但没有一个有效。
是唯一可以workspace/通过 提供的解决方案site_packages吗?如果是这样,最好的方法是什么?
编辑:
我尝试将 - 添加/home/rico/workspace/到PYTHONPATH- 没有运气。
编辑2:
我能够成功使用 klobucar 的解决方案,但我认为它不会作为通用解决方案,因为该实用程序将被其他几个开发人员使用。我知道我可以使用一些 Python 泛化来确定每个用户的相对路径。我只是觉得有一个更优雅的解决方案。
最终,该脚本将通过 cron 运行,对多个 Python 项目执行单元测试。每个开发人员都可以使用它,以确保在开发过程中进行集成测试。
我需要能够使这个更加普遍。
编辑3:
抱歉,对于我想要实现的目标,我真的不喜欢这些解决方案。我很欣赏您的意见 - 我正在使用它们作为临时解决方案。作为一个完整的修复,我将考虑添加一个site_packages目录中可用的脚本,该脚本将添加到PYTHONPATH. 这是多台机器和多个开发人员都需要的。
一旦我构建了完整的解决方案,我将在此处发布我所做的事情并将其标记为解决方案。
编辑4:
我觉得我这个问题好像没有很好地表达我的需求。下面的答案很好地解决了这个问题 - 但不是我的实际需求。因此,我在另一篇文章中重组了我的问题。我考虑编辑这个,但是下面的答案(这对其他人非常有帮助)对更改没有意义,并且看起来不合适且无关紧要。
对于这个问题的修订版本,请参阅Unable to import Python package universally
我有一个像这样的 python 包目录:
proj/
mod_a/
__init__.py
x.py
submod_x/
__init__.py
y.py
mod_b/
__init__.py
z.py
Run Code Online (Sandbox Code Playgroud)
与 x.py:
import submod_x.y
Run Code Online (Sandbox Code Playgroud)
z.py:
import sys, os.path
sys.path.append(os.path.abspath('../'))
import mod_a.x
Run Code Online (Sandbox Code Playgroud)
现在当我跑步时:
$ python2 z.py
Run Code Online (Sandbox Code Playgroud)
我用 y.py 编码完成了事情
但是当我跑步时:
$ python3 z.py
Run Code Online (Sandbox Code Playgroud)
我有一个例外:
Traceback (most recent call last):
File "z.py", line 4, in <module>
import mod_a.x
File ".../proj/mod_a/x.py", line 1, in <module>
import submod_x.y
ImportError: No module named 'submod_x'
Run Code Online (Sandbox Code Playgroud)
我想知道Python 2和Python 3在导入包时有什么区别,以及如何在Python 3中使用绝对导入来导入位于其父目录中的包?
我有一个名为的文件夹Script,里面有temp.py脚本.我的临时脚本从被调用的子文件夹导入模块lib.
Lib文件夹里面有空__init__.py和我的parent_computer_test.py脚本.
在我的temp.py脚本中是以下代码:
import lib.parent_computer_test as parent_computer_test
parent_computer_test.mainChunk()
parent_computer_test.splitChunks()
Run Code Online (Sandbox Code Playgroud)
我设法从子文件夹导入模块没有任何更大的问题.
这个工作流程/脚本工作正常,但由于特定原因,我的lib文件夹必须在我的计算机上的其他位置.有一个很长的故事,但它必须是那样的.
长话短说.我希望我temp.py的/Script文件夹从文件夹lib(或任何其他名称)导入模块parent_computer_test.py,但同时此文件夹不是子文件夹/Script- 因此它位于计算机的其他位置.它可以是C:/development/...什么的.
所以我的问题是如何从特定文件夹导入模块?
我有几个模块,在开发Sublime Text软件包时,我想重新加载而不必重新启动Sublime Text。
我正在运行Sublime Text内部版本3142,该版本python3.3连续运行其软件包/插件。但是,在开发插件时,我将添加到path的第三方模块导入为:
import os
import sys
def assert_path(module):
"""
Import a module from a relative path
/sf/ask/19546621/
"""
if module not in sys.path:
sys.path.insert( 0, module )
current_directory = os.path.dirname( os.path.realpath( __file__ ) )
assert_path( os.path.join( current_directory, 'six' ) ) # https://github.com/benjaminp/six
import six
Run Code Online (Sandbox Code Playgroud)
但是,当我编辑模块的源代码时,six我需要再次关闭并打开Sublime Text,否则Sublime Text无法获取对sixpython模块的更改。
到目前为止我尝试过的一些代码:
print( sys.modules )
import git_wrapper
imp.reload( find_forks )
imp.reload( git_wrapper )
imp.reload( sys )
Run Code Online (Sandbox Code Playgroud)
我正在尝试从同级文件夹中的 python 文件导入模块。我在这里阅读了几个类似的问题并尝试应用那里列出的解决方案,但我无法解决问题。
结构如下:
parentfolder/gfolder/codefolder/fileA.py
parentfolder/gfolder/utilfolder/util.py
Run Code Online (Sandbox Code Playgroud)
gfolder,codefolder并且utilfolder都有一个__init__.py.
我正在尝试在 fileA.py 中执行以下操作:
import gfolder.utilfolder.util as util
Run Code Online (Sandbox Code Playgroud)
我还尝试在导入语句之前添加:
sys.path.append(".../parentfolder/")
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
import gfolder.utilfolder.util as util
ModuleNotFoundError: No module named 'gfolder'
Run Code Online (Sandbox Code Playgroud)
类似问题中的解决方案说要包含__init.py__在我已经拥有的目录中。
编辑:现在无论是sys.append和sys.insert工作,问题是,我包括在路径的结尾斜线。当我把它拿出来时,一切正常。
python ×10
import ×3
python-3.x ×3
python-2.7 ×2
coding-style ×1
directory ×1
module ×1
pyc ×1