我使用的是Python 3.5.1.我在这里阅读了文档和包部分:https://docs.python.org/3/tutorial/modules.html#packages
现在,我有以下结构:
/home/wujek/Playground/a/b/module.py
Run Code Online (Sandbox Code Playgroud)
module.py:
class Foo:
def __init__(self):
print('initializing Foo')
Run Code Online (Sandbox Code Playgroud)
现在,在/home/wujek/Playground:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Run Code Online (Sandbox Code Playgroud)
同样,现在在家里,超级文件夹Playground:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
Run Code Online (Sandbox Code Playgroud)
实际上,我可以做各种各样的事情:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我虽然有被需要的__init__.py文件(空的都可以)两种a,并b为module.py要导入的时候Python的路径指向Playground文件夹?
这似乎已经从Python 2.7改变了:
~ $ PYTHONPATH=Playground …Run Code Online (Sandbox Code Playgroud) 我正在运行(生物)python脚本,导致以下错误:
from: can't read /var/mail/Bio
Run Code Online (Sandbox Code Playgroud)
看到我的脚本与邮件没有任何关系,我不明白为什么我的脚本在查找/ var/mail.
这里似乎有什么问题?我怀疑它会有所帮助,因为脚本似乎不是问题,但无论如何这里是我的脚本:
from Bio import SeqIO
from Bio.SeqUtils import ProtParam
handle = open("examplefasta.fasta")
for record in SeqIO.parse(handle, "fasta"):
seq = str(record.seq)
X = ProtParam.ProteinAnalysis(seq)
print X.count_amino_acids()
print X.get_amino_acids_percent()
print X.molecular_weight()
print X.aromaticity()
print X.instability_index()
print X.flexibility()
print X.isoelectric_point()
print X.secondary_structure_fraction()
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?糟糕的python设置?我真的不认为这是剧本.
(我意识到StackOverflow上有很多关于python相对导入的问题;我怀疑我这样做是错误的;但无论如何都要进行..)
我有一个python项目(mysubmod)组织如下:
/__init__.py
/lib
- /__init__py
- /foobar.py
/models
- /__init__.py
- /hello.py
Run Code Online (Sandbox Code Playgroud)
重要的:
然后我有第二个项目(myproj),我已经将mysubmod作为git子模块导入其中; myproj现在组织如下 -
/mysubmod
/scripts
- /__init__.py
- /__test.py
Run Code Online (Sandbox Code Playgroud)
哪里:
但是,当我从命令行运行/scripts/test.py时,解释器现在抱怨mysubmod/models/hello.py无法再找到lib.foobar.
刷新.
更改了mysubmod/models/hello.py,因此它现在导入..lib.foobar
现在我可以毫无怨言地运行/scripts/test.py,但我不能再从命令行运行任何submod脚本作为文件; 我只能使用python -m选项将它们作为模块运行.
此外,我不能再单独运行submod项目文件,即使使用-m选项,因为解释器抱怨"尝试相对导入超出顶级包"; 我必须上一个目录级别,即只能从myproj根目录运行mysubmod(其中mysubmod作为根级别目录).
这一切似乎都令人不满意.我希望能够:
有没有人对如何做到这一点?关于git子模块和python的最佳实践的任何看法?
谢谢.
我在 Pycharm 中有一个 python 项目,其中有一个嵌套的 Git 子模块。这是文件夹结构:
my-git-repo
git-submodule-repo
package1
foo.py
bar.py
package2
baz.py
.gitmodules
Run Code Online (Sandbox Code Playgroud)
导入git-submodule-repo的结构如下:
foo.py:
from package1.bar import some_func
Run Code Online (Sandbox Code Playgroud)
但是,Pycharm 不承认这一点,并希望我改为拥有以下内容:
foo.py:
from git-submodule-repo.package1.bar import some_func
Run Code Online (Sandbox Code Playgroud)
这是有问题的,因为我不想更改所有导入git-submodule-repo(这似乎不是一个好的做法,而且不可扩展)并且其中git-submodule-repo有破折号,这对于导入来说不是有效的 Python 语法(我可以) t 重命名回购)。
我还需要一种从git-submodule-repo代码中导入的方法。像这样的东西:
baz.py:
from git-submodule-repo.package1.bar import some_func
Run Code Online (Sandbox Code Playgroud)
但当然没有破折号使其语法无效。这是内容.gitmodules以防万一它有用:
[submodule "git-submodule-repo"]
path = git-submodule-repo
url = https://github.com/SomeAccount/git-submodule-repo.git
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激!