0

親ディレクトリからファイルをインポートしようとしていますが、今のところうまくいきません:

.
├── e.py
├── __init__.py
├── q.py
└── subproject
    ├── __init__.py
    ├── sfile.py

ここにコードがありますsfile.py

 import sys, os                                                                  

 topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),   
                                                 os.pardir, os.pardir))          
 if os.path.exists(os.path.join(topdir, "project", "__init__.py")):        
     sys.path.insert(0, topdir)                                         

 from project import e

そして、それは私にエラーを与えています:

Traceback (most recent call last):
  File "sfile.py", line 8, in <module>
    from project import e
ImportError: No module named project

しかし、Python インタープリターに行って同じことをすると、うまくいきます。

>>> import os, sys
>>> topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir))
>>> if os.path.exists(os.path.join(topdir, "project", "__init__.py")):
...     sys.path.insert(0, topdir)
... 
>>> from project import e
IN e
>>> 

そして、ここに私のe.pyファイルがあります:

print "IN e"

編集:

sergey@sergey-PC:~/tmp/project/subproject$ ls
__init__.py  __init__.pyc  sfile.py  sfile.pyc  www.py  www.pyc
sergey@sergey-PC:~/tmp/project/subproject$ pwd
/home/sergey/tmp/project/subproject
sergey@sergey-PC:~/tmp/project/subproject$ python
Python 2.7.3 (default, Apr 10 2013, 05:13:16) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.abspath(os.curdir)
'/home/sergey/tmp/project/subproject'
>>> 

しようとしたときの出力は次のとおりですfrom .. import e

Traceback (most recent call last):
  File "sfile.py", line 3, in <module>
    from .. import e
ValueError: Attempted relative import in non-package

For sys.argv[0]: インタプリタで:

>>> import sys
>>> sys.argv[0]
''
>>> 

print sys.argv[0]ファイルの先頭に追加する場合:

sergey@sergey-PC:~/tmp/project/subproject$ python sfile.py
sfile.py

更新日sys.argv[0]

sergey@sergey-PC:~/tmp/project/subproject$ python sfile.py
/home/sergey/tmp/project/subproject/sfile.py

通訳者:

>>> import os
>>> os.path.abspath(sys.argv[0])
'/home/sergey/tmp/project/subproject'
>>> 
4

1 に答える 1

1

最初のものはファイルから同じフォルダーにジャンプするだけなので、これが機能するには別の os.pardir が必要です (既にフォルダー内にいるため、割り込みでは発生しません)。

topdir = os.path.normpath ( os.path.join (os.path.abspath(sys.argv[0]),   
                    os.pardir, os.pardir, os.pardir) )

もちろん、これは冗長で面倒です。これはどう:

dirs = [ os.path.abspath(sys.argv[0]) ] + [os.pardir] * 3
topdir = reduce(lambda x, y: os.path.join(x, y), dirs)

ネストされたファイルのレベルに応じて変更する方が簡単です (マジック ナンバー 3 を変更するか、動的にするだけです)。

于 2013-10-23T19:16:20.737 に答える