如何将 python 包中的父目录(不在路径上)中的文件导入到子目录中的文件中?
我不太清楚 python 打包的词汇,所以举个例子:
dir1/
__init__.py
runner.py
in_dir1.py
dir2/
__init__.py
in_dir2.py
Run Code Online (Sandbox Code Playgroud)
dir1/in_dir1.py:
def example():
print "Hello from dir1/in_dir1.example()"
Run Code Online (Sandbox Code Playgroud)
dir1/dir2/in_dir2.py
import in_dir1 #or whatever this should be to make this work
print "Inside in_dir2.py, calling in_dir1.example()"
print in_dir1.example()
Run Code Online (Sandbox Code Playgroud)
鉴于它dir1不在 python 路径上,我正在寻找导入in_dir1到in_dir2.
我尝试from .. import in_dir1并from ..dir1 import in_dir1 基于此问答,但都不起作用。执行该意图的正确方法是什么?这个问答似乎包含了答案;但是,我不太确定该怎么做/如何使用PEP 366实际解决我的问题
两个__init__.py文件都是空的,我使用的是v2.6。
我试图在不使用谷歌不断出现的任何路径黑客的情况下做到这一点。
根据python文档,自python 2.5开始支持相对导入和内部包引用。我当前正在运行Python 2.7.3。因此,我尝试在自己的程序包中实现此功能,以便将其用于更简单的导入。我很惊讶地发现它引发了SyntaxError异常,我希望有人可以帮助您找到原因。
我设置了一个测试目录进行测试:
tester
??? __init__.py
??? first_level.py
??? sub
??? __init__.py
??? second_level.py
Run Code Online (Sandbox Code Playgroud)
两个__init__.py模块都为空。其他模块是:
# first_level.py
print "This is the first level of the package"
Run Code Online (Sandbox Code Playgroud)
# sub/second_level.py
import ..first_level
print "This is the second level"
Run Code Online (Sandbox Code Playgroud)
当我尝试导入second_level模块时,出现以下错误:
Python 2.7.3 (default, Aug 1 2012, 14:42:42)
[GCC 4.2.1 Compatible Apple Clang 4.0 ((tags/Apple/clang-421.0.57))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Welcome!
>>> import tester
>>> import tester.sub.second_level
Traceback (most recent call last):
File "<stdin>", line …Run Code Online (Sandbox Code Playgroud) 我做了一些研究,发现了以下文章:http : //effbot.org/zone/import-confusion.htm。虽然这似乎是一个很好的指南,但它写于 1999 年,不久前。我正在使用 Python 3.4.3,所以我认为有些事情发生了变化,这让我很担心,因为我不想学习不适用的内容。因此,在 Python 3 中,导入包和模块的所有方法是什么?哪些方式是最常见的,应该优先于其他方式使用?
我有以下软件包要分发:
mymodule/
data/
1.txt
mymodule/
__init__.py
tests/
test_mymodule.py
setup.py
Run Code Online (Sandbox Code Playgroud)
为了在vitualenv下安装它,我应用以下命令:
pip install .
Run Code Online (Sandbox Code Playgroud)
一切都安装正确,但我的数据文件的路径已损坏。
>>> from mymodule import get
>>> print(get())
...
FileNotFoundError: [Errno 2] No such file or directory: '/home/alexander/Stuff/pip_example/mymodule_test/venv/lib/python3.5/site-packages/mymodule/../data/1.txt'
Run Code Online (Sandbox Code Playgroud)
经过研究发现,该文件夹data是在导致错误的virtualenv文件夹的根目录中创建的。我应该如何改进代码以保持测试正常工作并拥有正确的数据文件路径?
文件内容:
数据/1.txt
yes
Run Code Online (Sandbox Code Playgroud)
mymodule / __ init__.py
import os
src = os.path.join(
os.path.dirname(__file__),
'../data/1.txt'
)
def get():
with open(src) as f:
return f.read().strip()
Run Code Online (Sandbox Code Playgroud)
测试/ test_mymodule.py
import unittest
import mymodule
class MymoduleTest(unittest.TestCase):
def test_get(self):
s = mymodule.get()
self.assertEqual(s, "yes")
Run Code Online (Sandbox Code Playgroud)
setup.py
from distutils.core import setup
data_files = [ …Run Code Online (Sandbox Code Playgroud) 我希望能够从命令行运行我的Python项目.我正在引用其他项目,所以我需要能够在其他文件夹中运行模块.
使这项工作的一种方法是修改Pythonpath环境变量,但我认为这是滥用.另一个黑客是将我想要的所有文件复制到一个目录中,然后运行Python.有没有更好的方法呢?
注意:我实际上是在Eclipse中编程,但我希望能够远程运行该程序.
类似的问题:
我有这样的包裹
package/
__init__.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
moduleC.py
moduleD.py
subpackage2/
__init__.py
moduleX.py
moduleY.py
moduleZ.py
Run Code Online (Sandbox Code Playgroud)
在moduleB.py中,我正在导入
from moduleA import bar
Run Code Online (Sandbox Code Playgroud)
在moduleA中,我正在导入
from moduleB import foo
Run Code Online (Sandbox Code Playgroud)
我收到了ImportError.
ImportError: cannot import name foo
Run Code Online (Sandbox Code Playgroud)
这可能是什么问题?为了避免这个问题,我该怎么办?我应该在_ init _ .py pf包,subpackage1,subpackage2中写什么?
_ INIT _ subpackage1的的.py
from moduleA import *
from moduleB import *
from moudleC import *
from moudleD import *
Run Code Online (Sandbox Code Playgroud)
subpackage2的_ init _ .py
from moduleX import *
from moduleY import *
from moduleZ import *
Run Code Online (Sandbox Code Playgroud)
_ init _ .py包
from subpackage1 import * …Run Code Online (Sandbox Code Playgroud) 应用程序结构:
.
??? Makefile
??? Pipfile
??? Pipfile.lock
??? README.md
??? template.yaml
??? tests
? ??? __init__.py
? ??? unit
? ??? lambda_application
? ??? test_handler.py
? ??? test_parent_child_class.py
??? lambda_application
??? __init__.py
??? first_child_class.py
??? lambda_function.py
??? second_child_class.py
??? requirements.txt
??? parent_class.py
4 directories, 14 files
Run Code Online (Sandbox Code Playgroud)
来自的代码示例lambda_function.py:
import os
import json
from hashlib import sha256
import boto3
from requests import Session
from .first_child_class import FirstChildClass
def lambda_handler(event, context):
# Do some stuff.
Run Code Online (Sandbox Code Playgroud)
照原样,我收到错误消息“无法导入模块'lambda_function'”,但是如果我注释掉了最后一个导入,“从.first_child_class import FirstChildClass”,它可以越过该部分并得到我没有的错误。为该类加载了模块。
当我在lambci / …
我对Python的import陈述有一些疑问:
import <module>和之间有什么区别from <module> import *?
如何导入不在同一目录中的模块?(而不是PythonHome)
请考虑我是一个Python新手
我正在使用 Python 3。我在同一目录中有两个 Python 文件:first.py 和 second.py。在 first.py 的开头,我使用:
from second import *
Run Code Online (Sandbox Code Playgroud)
但是,它返回以下错误消息:
ModuleNotFoundError: No module named 'second'
Run Code Online (Sandbox Code Playgroud)
我应该如何在 first.py 中导入它?
更新:为了澄清我的具体用例,我试图在 Django 中拆分我的 settings.py。我有一个主要的 settings.py 文件和另一个只包含机密信息的文件。我遵循以下文档,该文档在 settings.py 中使用以下行:
from settings_local import *
Run Code Online (Sandbox Code Playgroud)
请注意,settings_local.py 位于同一目录中。但是,它返回以下错误消息:
ModuleNotFoundError: No module named 'settings_local'
Run Code Online (Sandbox Code Playgroud)
我知道文档说“为了与 Django 1.4 及更高版本兼容,需要修改下面列出的一些示例。” 但我不知道如何在 Python 3 中使用它。
我有一个文件调用entryPoint.py:
from .commonLib.deviceLib import *
Run Code Online (Sandbox Code Playgroud)
我有一个名为deviceLib.py:
import math
import sys
import logging
import requests
import this
class DeviceLib(object):
def __init__(self, connectionDb):
self.__db = connectionDb
Run Code Online (Sandbox Code Playgroud)
树是这样的:
/test
entryPoint.py
/commonLib
__init__.py
deviceLib.py
Run Code Online (Sandbox Code Playgroud)
当我执行时,python entryPoint.py我收到错误:Attempted relative import in non-package。请帮我。
python ×9
import ×4
python-3.x ×3
importerror ×2
aws-lambda ×1
command-line ×1
django ×1
hierarchy ×1
packaging ×1
pip ×1
python-2.7 ×1
pythonpath ×1
setup.py ×1
syntax-error ×1