模块路径依赖性

时间:2014-05-08 12:00:52

标签: python

让我们假设项目的目录结构为

<root>
  __init__.py
  helloworld.py
<moduleOne>
  f.txt
  __init__.py
  printfile.py

其中root和moduleOne是目录

helloworld.py的内容:

#!/usr/bin/python
import helloworld.printfile
printf()

moduleOne / printfile的内容

#!/usr/bin/python
f = open('f.txt')

def printf():
    print 'print file'
    print f

if __name__ == '__main__':
   printf()

我的问题:

从moduleOne / printfile的执行是好的,但是从root /,如果我运行helloworld.py,会发生以下错误:

import moduleOne.printfile
File "/root/moduleOne/printfile.py", line 5, in <module>
 f = open('f.txt')
IOError: [Errno 2] No such file or directory: 'f.txt'

如何在python中解决这个问题?

[被修改]

我使用&#34;解决方法&#34;解决了(或多或少)这个问题,但是stil有问题:

我的解决方案:

在moduleOne / printfile

import sys
fname = 'moduloOne/f.txt'

def printf():

    f = open(fname)
    print 'print file'  
    print f

if __name__ == '__main__':

    fname = 'f.txt'
    printf()    

但是....

假设我有一个新目录,从根目录,等等,然后新结构是:

<root>
  __init__.py
  helloworld.py
<moduleOne>
  f.txt
  __init__.py
  printfile.py
<etc>
  f2.txt

现在我需要从moduleOne / printfile获取etc / f2.txt。如何?

1 个答案:

答案 0 :(得分:1)

你需要更多的抽象。

  1. 请勿在{{1​​}}
  2. 中对文件路径进行硬编码
  3. 请勿访问printfile.py函数中的全局。
  4. 接受文件句柄作为printf函数的参数:

    printf
  5. 在一个 实际上需要知道def printf(file_handle): print 'print file' print file_handle 的路径的脚本中(我猜你的f.txt),把它放在那里,打开它,并将其传递给helloworld.py

    printf
  6. 更好的是,从命令行获取文件路径

    from moduleOne.printfile import printf
    
    my_f_file = open('/path/to/f.txt')
    printf(my_f_file)
    
  7. 编辑:你在your Google+ cross-post上说:

      

    完整路径是问题,程序将在不同的环境中运行。

    如果您尝试将程序分发给其他用户和计算机,则应查看making a distribution package(请参阅下面的注释3),并使用import sys from moduleOne.printfile import printf input_file_path = sys.argv[1] my_f_file = open(input_file_path) printf(my_f_file) 包含您的配置文件,以及{ {1}}或package_data访问配置文件。见How do I use data in package_data from source code?

    一些旁注:

    1. 使用尾部斜杠表示目录作为目录名称,例如the tree command pkgutil而不是pkg_resources/而不是<root>的约定
    2. 您将“模块”与“包”混为一谈。我建议您将moduleOne/重命名为<moduleOne>。具有moduleOne/文件的目录构成包。以packageOne/扩展名结尾的文件是一个模块。模块可以通过物理存在于具有__init__.py文件的目录中而成为包的一部分。包可以是其他包的一部分,它是父目录的物理子目录,带有.py文件。
    3. 不幸的是,术语“包”在Python中被重载,也可能意味着用于分发和安装的Python代码集合。见the Python Packaging Guide glossary